Skip to content

java调优

XLforward edited this page Jun 1, 2018 · 10 revisions

1. 查看服务器资源(cpu、内存、网络、磁盘)的使用情况 命令:tsar;查看服务器资源使用日志tsar -i 1

2. jvm 编译优化参数

-XX:+CMSScavengeBeforeRemark 在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段

-XX:+TieredCompilation

因此Java程序要达到一个比较稳定的高效的代码执行是需要一定的时间的,为了解决这种问题,通常来说暂时可以采用的解决方法是:

1). 主动对Java程序进行热身

在启动完成后,主动的访问热点的代码入口,确保主要的热点代码编译成机器码后再放入流量,可通过-XX:+PrintCompilation来确认。

2). 逐步放进流量

通过apache/nginx转发等逐步的放入流量,用流量来完成Java程序的热身也是一种方法,但通常来说这个操作起来比较复杂。

对于特别重要的应用,建议用第一种方法,jvm启动参数中加入-XX:+TieredCompilation

3. 如何定位消耗最多的CPU线程

http://lovestblog.cn/blog/2016/03/31/cpu-thread/

4. try catch

catch exception无法捕获throwable 类型的异常

5. 代码导致jvm crash

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。

5. -XX:+CMSScavengeBeforeRemark

cms gc回收old之前做一次ygc就能保证新生代的对象被回收

mvn调试

命令:sh -x mvn