话不多说奔主题,精神抖擞就是干!
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
用文本编辑器打开,大概是长这样的