中级或者高级开发面试或多或少都会被问到,你了解jvm内存结构吗,能说说jvm有哪些调优吗
这里简单阐述下我个人对jvm优化的了解,欢迎大家帮忙补充
虽然jvm内存模型分为5块,但是jvm优化主要在堆这里,堆是存放对象的内存空间,优化这个空间其实就是为了防止stop-the-world的发生,也就是full gc
关于垃圾回收的请点击这个链接浅谈java垃圾回收
回到正题,优化主要出现在以下几个地方
一,新生代老年代占比
二,新生代对象存活时间
三,伊甸园和两个幸存者占比
四,垃圾回收算法的选取
我们先从第一点说起,首先新生代老年代占比,如果新生代过小会导致以下几个问题:
1.过大的对象会直接放入老年代,从而使full gc频繁
2.新生代会频繁的出发young gc 影响系统性能
3.老年代过大,导致一次full gc时间过长,影响系统性能
默认新生代老年代占比为1:3
第二点,新生代对象存活时间如果太小,那么新生代很快就会放入老年代,容易是内存被占满从而触发full gc,我们的目标是尽量让不经常使用的对象在新生代被干掉,如果存活时间过长,则会占满新生代内存,导致频繁young gc 影响性能
第三点伊甸园和幸存者占比,我们知道每个对象最初都会生成在Eden,如果伊甸园过小,则gc频率过高,如果过大,则会导致对象直接从Eden直接进入到老年代,间接导致full gc频繁,默认Eden:Survivor0:Survivor1 为 8:1:1
第四点,垃圾回收算法,可以根据上面的链接进入查看有哪些算法,哪些符合自己的系统要求,如果使用CMS算法,可以用堆外内存来弥补他的缺点,由于我还未使用过堆外内存进行处理,所以暂时不发表意见
以上就是个人对jvm优化的看法,请大牛帮忙指点