JVM
2016-11-29 17:28:33 0 举报
JVM(Java虚拟机)是Java技术的核心组成部分,它是一种抽象的计算机硬件,负责执行Java字节码。JVM的主要任务是加载、验证、编译和执行Java程序,确保程序在不同平台和环境下的可移植性和稳定性。JVM具有垃圾回收、内存管理、异常处理等核心功能,能够自动管理内存分配和释放,提高程序运行效率。此外,JVM还支持多线程、动态链接库等功能,为Java程序员提供了丰富的编程资源和便利的开发环境。总之,JVM是Java程序运行的基础,为Java语言的广泛应用和跨平台特性提供了坚实的支撑。
作者其他创作
大纲/内容
3
To Survivor
int b = 2;
new Obj();
线程私有
执行引擎
......
方法区
每个Slot能存放下面类型中的一个boolean、byte、char、short、int、float、reference、returnAddress
运行时常量池
局部变量表存放了编译器可知的基本数据类型(8种),对象引用,returnAddress类型
虚拟机栈
Obj obj =
线程共享
异常完成出口
returnAddress
方法出口
对象的引用
java虚拟机栈
局部变量表
当前栈帧
From Survivor
栈帧n
GC垃圾回收器
操作数栈
old
栈帧2
执行字节码指令:iadd
操作数栈是一个LIFO栈,栈内每个元素可以是任意的Java数据类型,包括long和double,32位数据类型栈的容量位1,64位为2.当一个方法开始执行的时候,这个操作数栈内是空的,在方法的执行过程中,会有各种字节码指令在操作数栈中写入和提取,也就是出栈和入栈。
long和double是64位的,所以会占用两个Slot:Slot[n]和Slot[n+1]
引用
当前方法
本地库接口
本地方法库
Eden空间
程序计数器
+
栈帧:每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机中入栈到出栈的过程。
本地方法栈
Slot[0]
回收没有GC Root 引用的对象Root
出栈
动态链接
运行时数据区
堆
结果入栈
java堆
正常完成出口
Slot[n]
class文件
返回值出栈压入
默认15就进入老年代岁
方法区是java堆的逻辑组成部分,java8后取消了永久代的划分,及那个运行时常量池挪到堆中或者直接内存中。
int a = 1;
调用者栈帧
为什么将老年代移动到方法区?1,字符串存在永久代中,容易出现性能问题和内存溢出。2,类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。3,永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。4,元空间不再使用虚拟机内存而是使用本地内存,元空间大小只受本地内存限制
0 条评论
下一页