JVM优化及部分剥析
本文作者:FUNKYE(陈健斌),杭州某互联网公司主程。
前言
JVM是什么?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
以上的说明我们随意去百度,google都可以查到相关解释,但是我们要了解jvm的哪些东西呢?
JVM内存调优
jvm调优,想必大家都了解不少了?这边我们来回忆一下调优所需要知道的相关细节.
1.full gc是什么?
full gc会对整个堆进行回收,一般普通gc即可,但是如果你刻意的去写一个不断创建新对象,并且内存分配过低时,可以使用jinfo –flag UseSerialGC,或者-XX:+PrintGC等操作来打印,可以看到起初一般都是普通的gc回收,这里涉及到复制算法,标记算法等等回收策略.但是等到内存不断的被挤占后,会发现打印的全是fullgc了,因为普通的gc已经无法满足当前的内存资源回收的情况了.但是fullgc的效率因为要回收整个堆,导致慢的情况发生.所以我们要避免full gc的发生.
我们可以详细看看导致的原因
1).年老代(Tenured)被写满
调优的时候,尽量的让新生代gc时直接被回收掉,避免频繁出现在老年代的情况发生
2).持久代空间不足
尽量的在测试时,发现该问题,增大perm gen空间,避免太多多余的静态对象产生.
3.尽量主动触发System.gc操作,让jvm自身来调节
2.如何去正确的调优,步骤又是如何呢?
1.我们需要合理的工具去帮协助我们,比如Windows下可直接使用jvisualvm这个工具,jdk自带.
2.耐心且不断的调试,优化jvm参数,使程序进入一个合理的状态.
3.判断结果是否需要优化,如果各参数已经达到一个合格的指标时,分析系统日志是否有超时情况出现,gc的频率如何,耗时又是如何,如果gc需要1-3秒的时间调整那么必须去优化整个程序
1).判断标准:
- Minor GC执行时间不到50ms;
- Minor GC执行不频繁,约10秒一次;
- Full GC执行时间不到1s;
- Full GC执行频率不算频繁,不低于10分钟1次;
4.如果对项目非常熟悉,优化又比较有经验时,可通过自己的判断,去调整年老代的并行收集算法:-XX:+UseParallelOldGC