-
Notifications
You must be signed in to change notification settings - Fork 0
java调优
-XX:+CMSScavengeBeforeRemark 在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段
-XX:+TieredCompilation
因此Java程序要达到一个比较稳定的高效的代码执行是需要一定的时间的,为了解决这种问题,通常来说暂时可以采用的解决方法是:
在启动完成后,主动的访问热点的代码入口,确保主要的热点代码编译成机器码后再放入流量,可通过-XX:+PrintCompilation来确认。
通过apache/nginx转发等逐步的放入流量,用流量来完成Java程序的热身也是一种方法,但通常来说这个操作起来比较复杂。
对于特别重要的应用,建议用第一种方法,jvm启动参数中加入-XX:+TieredCompilation
http://lovestblog.cn/blog/2016/03/31/cpu-thread/
catch exception无法捕获throwable 类型的异常
ava进程crash或无故退出也是会碰到的现象,对于进程crash,默认情况下jdk会生成hs_err[pid].log的文件,core dump打开的话也会生成core dump文件,当进程crash发生时,可以先看看hs_err[pid].log,如没找到此文件,但有core dump文件,有可能的原因是代码中出现了无限递归或死循环,可通过jstack 来提取出java的线程堆栈,从而具体定位到具体的代码;如有hs_err[pid].log以及core dump文件,则需要具体原因具体排查,这个比较麻烦,常见的可能会有上面的native oom(还有可能是32 bit机器,但java进程已经申请了超过3g的地址空间),某些代码jit编译出问题了(可通过指定某些代码不让jit编译来避免,但会影响性能:-XX:CompileCommand=exclude,类名/方法名)。 比如依赖guava的lru缓存 在jdk1.6的jit编译时可能触发 jvm crash,可以配置 jvm参数:XX:compileCommand=exclude,com.google.common.cache.LongAdder::add 在jit编译优化时将add方法排除,避免crash。
cms gc回收old之前做一次ygc就能保证新生代的对象被回收
命令:sh -x mvn