前两天看了关于JVM方面的视频,简直是豁然开朗,之前一直急于学习Java这么语言的内容,原来发现这门语言的魅力所在,它包含的内容很广泛,单纯的想入行互联网可能学习一些基础,做几个项目就可以达到预期目标,但是你想要去互联网大厂或者不仅仅想做一名码农,你必须更深入的学习。目前的规划就是把这门语言基础学好然后按照下面的路线走(当然只是计划,计划可能赶不上变化),认真学完这些内容就算进不了大厂,去中厂也满足吧。个人理解,如有错误请谅解。
1.直接放图,下面是JVM的结构以及垃圾回收机制的部分内容
2.JVM由三大部分组成:类装载子系统,字节码执行引擎,运行时数据区(内存模型)
2.1 栈(线程)
.java文件编译成.class文件之后进入类装载子系统,然后在运行时数据区执行。运行时数据区包括堆,栈,本地方法栈,方法区,程序计数器。首先来总结一下栈(线程)组成,当程序运行至main函数入口时会开辟一个main线程,假设定义了一个方法是computer(),进入主函数之后会在线程开辟一个computer()栈帧和main栈帧,对computer()栈帧进行分析,里面包含了局部变量,操作数栈,动态链接,方法出口。当程序执行到computer()方法时通过程序的源码来分析,idea中找到Math.class文件然后打开终端输入javap -c Math.class > math.txt进行反编译,编译程序和Java程序如下:
反编译代码:
Compiled from "Math.java"
public class com.lzm.jvm.Math {
public static final int ini;
public com.lzm.jvm.Math();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public int computer();
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: bipush 10
9: imul
10: istore_3
11: iload_3
12: ireturn
public static void main(java.lang.String[]);
Code:
0: new #2 // class com/lzm/jvm/Math
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method computer:()I
12: pop
13: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
16: ldc #6 // String c
18: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
21: return
}
Java源码:
package com.lzm.jvm;
public class Math {
public static final int ini = 66;
public int computer(){
int a = 1;
int b = 2;
int c = (a+b)*10;
return c;
}
public static void main(String[] args) {
Math math = new Math();
math.computer();
System.out.println("c");
}
}
执行int a时在局部变量表中给a分配一个内存地址,iconst_1表示将int类型常量1压入操作数栈,执行 istore_1时,压入栈的值出栈存入局部变量a中,其他的也可这样分析,当执行到iload_1时,程序计数器开始记录程序执行的行号,此程序中程序计数器记录到第一个iload_1时值为4.当执行完computer()方法时,内存被清理。
2.2 堆中的垃圾回收机制
我们知道堆由年轻代和老年代组成,年轻代又细分为伊甸园区,survivor区,他们的内存比为8:1:1,由可行信分析算法(GC Root)可以区分出垃圾,垃圾首先进入Eden,当Eden装满时字节码执行引擎调用Minor gc并产生STW(时间比较短),假设Eden15s收集满并且溢出,这时候用户线程停止,Minor gc开始回收垃圾,其中第15s时STW程序停止运行,开始清理,也就是第15s产生的对象还不能被清理,这时它会移动到S0,同时寿命加1,同理在S0和S1中交替移动,当寿命为15时还没被清理就会被移动到老年代,值得注意的是并不只有寿命为15的对象可以移动到老年代,当S0或者S1中的对象内存大于S0或者S1内存的50%(可设置)也会被当做大对象移动到老年代。在老年代的对象也要历经15次产生full gc同时产生STW,用户线程停止,进行垃圾回收。
对垃圾回收机制感兴趣的可以看看这个视频,垃圾回收分类,算法以及过程都很详细链接:
[https://pan.baidu.com/s/1AVZLS30CNAREh_BP2NcBqQ ]
提取码:pvfp