JVM内存管理-运行时数据区
1.JVM是一种规范和运行时数据区
java程序运行过程
java程序运行过程.png
源码-> Java->.class->JVM ->ClassLoader
解释执行:
JVM C++写的 C++解释器
经过JVM的翻译,速度相对慢一点
JIT执行(hotspot):
java代码 翻译成 汇编 (机器码) 放到codcase
速度比加快
JDK JRE JVM
JRE 包含JVM和一些java类库
JVM的跨平台 (不同平台对应不同的JVM)
JVM的语言无关性(跟语言无关性,只要语言可以翻译成class文件)
常见的JVM实现.png
常见的JVM实现
1.hotspot Jrockit. Oracle
2 J9 IBM
3 LiquidVM BEA
4 Zing(C4算法 垃圾回收算法)
5 TaobaoVM
6 毕昇 华为
运行时数据区
运行时数据区.png
线程共享区:方法区(运行时常量池) 堆
线程私有区:虚拟机栈 本地方法栈 程序计数器
直接内存(对外内存)
2.栈帧的执行对内存区域的影响
栈帧的执行对内存区域的影响.png
java方法的运行与虚拟机栈
虚拟机栈:存储当前线程运行java方法所需的数据、指令、返回地址
栈帧
大小限制:-Xss
栈溢出:
超出虚拟机大小限制(方法死递归)
栈帧:
一个方法对应一个栈帧
局部变量表:记录方法中所有的局部变量
操作数栈:记录当前的操作数
完成出口:记录方法的完成行号
程序计数器:指向当前线程正在执行的字节码指令(字节码行号)
字节码的行号针对本方法的偏移
本地方法栈
方法区
直接内存 unsafe 绕过了JVM的垃圾回收
堆
深入理解JVM内存区域
深入理解JVM内存区域.png
JVM内存处理流程:
JVM申请内存
初始化运行时数据区
类加载
执行方法
创建对象
JHSDB工具:查看内存
内存虚拟化
堆溢出
栈溢出
方法区溢出
直接内存溢出