如果你已经深入到JVM,那么不能不了解下优化JVM的技巧,来避免系统因为不合理的内存分配造成宕机等严重的结果。
一般来说JVM性能调优很大一部分是通过对内存进行调优。这里的内存指的是堆内存。
堆是存放对象的地方。当我们new一个对象的时候,这个对象的实例数据就被放在了堆中。
java语言分为基本数据类型和引用数据类型。
基本数据类型就是那几个byte,short等等。
而引用类型又分为类类型,引用类型和数组类型。
堆在JVM的内存规定中分为新生代和年老代。
新生代是指那些刚被初始化的对象;被GC几次依然存在的对象就会被放入到年老代中。
程序在堆内存的GC一般有两种:minorGC和FullGC.
minorGC是小范围的垃圾回收,是经常发生的事,一般发生在年轻代。
FullGC是指全局的GC,内存不够时出发。
值得注意的是,FullGC的消耗时间相比minorGC要久的多,因此可能会有明显的系统延迟现象。
如果一个程序的minorGC过多,就要考虑适当的增大年轻代的内存。
通过-Xmn可以设置年轻代内存。
一般我们在设置最大内存和最小内存的时候最好把两个内存设置成一样的。也就是-Xms和-Xmx设置成同样的大小。
java程序在运行时,首先被分配-Xms指定的内存大小,默认是:
如果在程序运行过程中发现这个内存吧无法满足,就会向操作系统申请更多的内存,知道达到-Xmx指定的最大内存,如果超过这个最大内存,则会抛出:OutOfMemoryError
可以通过-Xms参数自定JVM启动时的最小内存,通过-Xmx指定堆内存的最大值。
最大堆指的是新生代和老年代的总和的最大值。
如果设置的最小堆内存很小,JVM会频繁的进行minorGC,虽然minorGC小号的时间比FullGC要少,但是
凡是进行GC,都会导致工作线程停止工作。
而且频繁的GC几次,活跃的对象也会被分配到老年代,造成老年代溢满。从而频繁进行FullGC。