1.JVM是虚拟机通用协议,hotspot实现了协议
2.jvm内存优化 指的是公共区域 即:方法去和堆区,其他的都是线程私有的。
3.堆区有分 新生区/老年区/元空间(1.8以后没有了永久区改成了元空间)。新生区又分了 伊甸区和存活区0/1
4.伊甸区回收叫Minor GC ,老年区垃圾回收叫Full GC.
5.新生区垃圾回收使用复制算法,老年区使用标记清楚/标记整理
6.新生区 中的伊甸区和survivor0/survivor1的比例是8:1:1,对象在Eden区创建
7.新生区复制算法过程:第一次伊甸区内存不够 发生Minor GC 存活下的对象 被MinorGC打包放在幸存区0, 下次对象在Eden区出生以后 (包括幸存区0 存活下的对象),在经过一次MinorGC后如果对象还存活,并且能够被幸存区1所容纳,则使用复制算法将存活的对象复制到幸存区1,然后清理所有使用过的Eden和幸存区0,并且将对象的年龄设置为1,以后对象每在幸存区熬过一次MinorGC,年龄就+1,当对象年龄达到某个值时(默认15 通过-XX:MaxTenuringThreshold 来设置),这些对象就进入老年区成为老年代。幸存区0/1之间是来回变化的,谁的空间为空 谁就负责接受 复制过来的存活对象。
8.老年区标记清楚/整理算法:标记清楚指通过一次遍历 标记活着的对象,二次遍历清楚死的对象,这样会产生内存碎片;标记整理则多次遍历区碎片化。
9.堆内存调优部分参数:-Xms 设置初始分配大小 如-Xms1024m(默认是物理内存的1/64);-Xmx 设置最大分配内存 如-Xms1024m(默认是物理内存的1/4);这两个值一般设置成一样的。-XX:+PrintGCDetails 输出详细的GC处理日志。
long maxMemory = Runtime.getRuntime().maxMemory();//返回java虚拟机能够使用的最大内存 对应-Xmx
long totalMemory = Runtime.getRuntime().totalMemory();//返回java虚拟机当前用到的内存