java认知描述_Java技术:JVM的初步认识( 五 )


而一般来说,我们把新生代的回收称为Minor GC,Minor意思是次要的,新生代的回收一般回收很快,采用复制算法,造成的暂停时间很短 。而Full GC一般是老年代的回收,病伴随至少一次的Minor GC,新生代和老年代都回收,而老年代采用标记-整理算法,这种GC每次都比较慢,造成的暂停时间比较长,通常是Minor GC时间的10倍以上 。
所以很明显,我们需要尽量通过Minor GC来回收内存,而尽量少的触发Full GC 。毕竟系统运行一会儿就要因为GC卡住一段时间,再加上其他的同步阻塞,整个系统给人的感觉就是又卡又慢 。
5JVM的优化
JVM的优化我们可以从JIT优化,内存分区设置优化以及GC选择优化三个方面入手 。
5.1JIT优化
正如前面所说的,在系统启动的时候,首先Java代码是解释执行的,当方法调用次数到达一定的阈值的时候(:1500,:10000),会采用JIT优化编译 。而直接将JVM的启动设置为-Xcomp并不会有想象中那么好 。没有足够的(侧写,可以大致理解为分析结果),优化出来的代码质量很差,甚至于执行效率还要低于解释器执行,并且机器码的大小很容易就超出字节码大小的10倍以上 。
那么我们能做的,就是通过附加启动命令适当的调整这个阈值或者调整热度衰减行为,在恰当的时候触发对代码进行即时编译 。
方法计数器阈值:-XX:回边计数器阈值:-XX:tage(这并不是直接调整阈值,回边计数器的调整在此仅作简单介绍,此计数器会根据是模式还是模式有不同的计算公式)关闭热度衰减:-XX:设置半衰周期:-XX:而JIT也是一片广阔的知识海洋,有兴趣可以根据以下的优化技术名称搜索了解详情,在此就不赘述了 。
5.2JVM内存分区优化
我们依据Java 这本书的建议的设置原则进行设置,
Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即之后的老年代内存占用的3-4倍,Xmx和Xms的大小设置为一样,避免GC后对内存的重新分配 。而Full GC之后的老年代内存大小,我们可以通过前面在 VM中添加的插件 GC查看 。先手动进行一次GC,然后查看老年代的内存占用 。
新生代Xmn的设置为老年代存活对象的1-1.5倍 。老年代的内存大小设置为老年代存活对象的2-3倍 。5.3垃圾回收器的认识
垃圾回收器有很多,他们各自有各自的特点,没有什么回收器是最好的,所以才会有这么多存在,而我们就需要根据实际情况来选择组合,进行JVM的调优 。
主要有以下7个垃圾回收器:
可以从这张图大概看到,哪些垃圾回收器是用于回收哪个代的,以及连线表示可以搭配组合使用 。
5.3.
是最基本,也是发展最悠久的垃圾回收器 。它采用单线程收集,在单CPU环境下效率很高,没有线程切换,专注于垃圾回收 。它作为模式JVM的默认垃圾回收器 。
我们通过-XX:+来选择使用它 。
5.3.
这个也就是的多线程版本,代码重复度都很高 。它是作为模式JVM的默认垃圾回收器 。但需要注意的是,多线程是它的特点,并不见得是优点 。在单核环境下是绝对不如的效率,在双核环境下都不能保证100%比的效率高 。它默认的线程数和CPU核数相同,在CPU核数非常多的环境下,比如32个,我们没有必要同时用32个线程来进行垃圾回收,线程的切换也是有相当大的性能开销的 。
我们可以通过-XX:+来选择使用它,通过-XX:来指定线程数 。
5.3.
这个垃圾回收器的特点感觉跟都一样,但它的关注点不同 。它的目标是达到一个可控制的吞吐量 。
吞吐量是什么意思呢?假如我们虚拟机总共运行了100分钟,其中垃圾收集花掉了1分钟,吞吐量则是99% 。