首页 > 技术文章 > 对JVM内部组成结构、栈帧、GC的简单理解(精简)

chenyixun 2020-06-19 15:55 原文

话不多说奔主题,精神抖擞就是干!

 

1. 先来说下这张图

上图下面两行注释部分:

绿色代表所有线程共享区域

白色代表每个线程独享区域

 

简单讲:JVM中包含

ClassLoader:类加载子系统,即加载class字节码文件用的。

ExecutionEngine:字节码执行引擎,包括给GC分配执行线程。

RuntimeDataArea:运行时数据区。其中又包含了,

  MethodArea:方法区,以前习惯叫永久代、持久代,JDK1.8之后叫元空间(它使用的是操作系统物理内存,而非JVM内存)。方法区其实不仅包含方法,还有常量(即字面量)、静态变量、类信息、运行时常量池等。

  Heap:线程堆,堆里面一般存放我们new出来的对象。

  JavaStack:java栈,栈里面一般存放临时变量,比如局部变量。它为每个线程提供独立的一块执行java代码的栈空间。

  NativeMethodStack:本地方法栈,主要是对本地操作系统提供的方法库(例如:Windows下的dll文件)的接口封装,现在都流行微服务,HTTP调用,所以现在这块已经不常用了。

  ProgramCounterRegister:程序计数器简称PC,对字节码文件执行行数的记录。例如:当一个线程在执行字节码文件中的指令方法时可能因为CPU分配给该线程的时间片到期了,需要暂停当前任务给其他线程让行,那么需要有人来记录下我当前任务执行到哪了(你可以理解为执行到哪一行代码了),以便我下次从个位置继续执行。

 

2. 线程栈,栈帧

假如我们写了这样一个java文件

Test.java

public class Test {

  public static void main(String[] args) {

    System.out.println("Hello World");

  }

}

编译成字节码文件

命令行:javac Test.java

输出:Test.class

用文本编辑器打开,大概是长这样的

推荐阅读