前两天看了关于JVM方面的视频,简直是豁然开朗,之前一直急于学习Java这么语言的内容,原来发现这门语言的魅力所在,它包含的内容很广泛,单纯的想入行互联网可能学习一些基础,做几个项目就可以达到预期目标,但是你想要去互联网大厂或者不仅仅想做一名码农,你必须更深入的学习。目前的规划就是把这门语言基础学好然后按照下面的路线走(当然只是计划,计划可能赶不上变化),认真学完这些内容就算进不了大厂,去中厂也满足吧。个人理解,如有错误请谅解。

Java工程师要求上机测试 java上机面试考些什么_栈

1.直接放图,下面是JVM的结构以及垃圾回收机制的部分内容

Java工程师要求上机测试 java上机面试考些什么_java_02


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