经过编译之后形成的字节码16进制文本文件
源代码编译之后形成.class的字节码文件,字节码文件经过类加载器,加载到JVM当中
左边是一个进程的所有线程共享的内存空间,右边是一个进程当中不同线程独有的
线程独占会随着线程结束而销毁,线程共有需要JVM来维护,比如GC对堆内存的维护
GC可以对方法区进行管理。方法区一般存放累的描述信息,类的静态成员变量等等
堆内存存放的是对象,GC主要是对对象实例进行回收,OOM错误就是堆内存满了。
堆中的GC算法后续会有详细介绍(分代搜集算法,复制算法,标记清除。标记压缩)等等
所有线程共享,看图。虚拟机栈这个地方主要保存的是线程的方法,每一个方法就是一个栈帧。
每一个方法里面含有局部变量,返回地址等等。栈内存溢出说的就是线程方法调用过多导致栈内存不够,比如说递归。
本地方法栈:是提供给native的修饰符修饰的方法使用的,v本地方法也和现成的调用方法一样。
程序计数器:记录当前线程执行到字节码的哪一行了,为了线程上下文切换
下面讲解的就是字节码文件:里面的内容,之前是16进制的表示
查看java源代码编译后的字节码文件:
类的描述信息:上图
方法的描述信息:上图
main函数的字节码编译之后的查看:上图(5是有5个本地变量,参数有1个)
指令码:16进制,去查表可以看字节码源文
第一步:字符串常量放在元空间,方法区中。首先类信息放在方法区中,常量池都放在方法区(元空间)
第二部:创建线程 本地方法栈现在还用不到:记录线程的方法栈,程序计数器(方法指针)
这时候有个新的方法进来,开辟一个新的栈