JVM调优
JVM调整FULL GC的执行效率,调整FULL GC的执行时间?GC垃圾回收机制;
JVM可以分为两块区域,一块是线程共享区(所有线程共享的),一块分为线程私有区(每个线程都有的);
线程共享区(线程不安全)包括方法区(方法区包括常量池,全类名)和Java堆(堆中存储所有的对象包含需要调优的对象);
线程私有区(线程安全)包含Java栈(用来存储栈帧),本地方法栈(对接C语言的接口,native栈),程序计数器;
栈帧:
栈帧等于方法(main方法或者其他方法),存储了局部变量表,操作数栈(执行JVM指令的存储空间),动态链接(记录多态之间的联系),返回地址(记录执行的代码行数的)
栈溢出的情况(操作数栈):
- 递归 ------>> 栈帧溢出
- 构建了易删的属性,操作数栈溢出(因为Java栈每个线程只有1M,超过1M就溢出了):因为是线程安全的(私有的)
线程共享区
方法区(1.8 合并到堆 元空间 (永久代))
堆:存储所有对象(GC存储的对象)
堆分为三个区:年轻代(Eden)、老年代(To)、幸存者区(From)(幸存垃圾)
- 新创建的Demo存储在年轻代,当年轻代(Eden)如果存满了会执行轻GC(要是被使用或者被引用就会放到幸存区)
- 如果幸存区满了,也会执行轻GC;要是执行GC回收不了了,会放到To区;
- 要是To区也满了,会进行位置交换,原有的To变成From,原有的From变成To,再执行轻GC,如果执行了15次GC,对象还没有被回收,进入老年代(To),等待fullGC执行。
总结:执行频率越少越好,执行时间越短越好
调优工具:jvs、jconsole、jstask、阿尔萨斯
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。
jconsole:用于对 JVM 中的内存、线程和类等进行监控;
jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
jconsole
调优的方向
调整年轻代的大小、老年代的大小、方法区的大小;
频繁GC的场景:方法区太小,常量数据太多又回收不了。