JVM
栈桢
javap -c .class文件进行反编译,字节码指令
op1=3;这行代码相当于上图字节码指令中的两行
istore0,赋值给局部变量0,局部变量是从索引0开始的
iload0 是入栈,将3入栈
iload1是将局部变量1,即op2入栈
iadd 将局部变量0,1弹出栈,进行相加,完成后入栈
istore2 ,相加的数值赋值给局部变量2,即代码中的result
main方法先压栈,然后这个方法进栈,完成后return,记录方法位置
java对象的内存布局
之前面试问,对象年龄保存在哪里,其实就是保存在对象头中
方法区和堆是进程,栈是线程,线程生命周期较短
下面讨论方法区和堆
jvm内存模型
(和java内存不一样,java中内存🈶主内存,工作内存)
回收需要停止(弊端)
对象太大,直接分配到老年代;年龄超过15(默认15),放到老年代.
新生代分成eden,s0,s1,经过回收,eden区对象放到s区,保证s0或者s1有一个为空,解决空间碎片问题,最大化利用young区,比例8:1:1,大多数对象会被回收(朝生夕死),这样配置减少GC回收次数,极少数回到s0区,万一s0区不够,会向老年代借空间(担保机制),s0和s1必须有一块是空的
young区和old区大小根据业务进行设计(JVM参数设置,后面会介绍)
GC
YoungGC(eden区和s区):minorGC
Old GC:Major GC,MajorGC通常伴随minorGc,会触发FullGC
Young+Old称作FullGC
尽可能减少FullGC次数,或者GC次数,允许一定的YoungGC
每一次GC对象年龄都会加1
Old区也放不下了,堆溢出;方法区也会溢出
下面探讨堆内存的垃圾回收,知道出问题如何排查和处理
1.确定什么对象是垃圾
引用计数(会存在循环引用问题),可达性分析
2.如何回收(回收算法,GC root(在java进程中长时间存在),由他出发,看对象是否可达),什么样的可以成为GC Root?
3.垃圾回收器
4.优势和劣势,如何选择
5.学会查看垃圾回收日志文件
下篇介绍