jvm内存模型:
运行时数据区中,蓝色部分代表线程独有,堆和方法区是线程共享;
方法区:类型信息(非class对象、类的元数据)、静态变量、常量等
线程栈:线程栈中的每个方法对应这一个栈帧(先进后出的原则)
栈帧:栈帧中维护这局部变量表、操作数栈、动态链接、方法出口
GC Root 可达性分析,由局部变量(root)所引用对象的整条链路,只要局部变量不消失,那么就不会被垃圾回收;
jvm调优的目的是:为了减少STW(stop-the-world)次数
FullGC会导致所有的用户级线程
- Minor GC 是 清理 新生代中的Eden区,Survivor区满时不会触发 ;
- Major GC 是 清理 老年代 ;
- Full GC 是 清理整个堆和方法区,包括 年轻代、老年代和方法区。
其实不论是minor gc还是major gc都会stop the world,区别只在于stop the world的时间长短。
Xms代表初始堆大小,Xmx最大堆的大小,Xmn代表新生代Eden的大小
我可以合理的设置Xmn的大小,尽量保持堆中的对象能够在新生代的时候就进行垃圾回收,避免FullGC;