JVM
2021-09-26 15:36:28 0 举报
JVM基础知识及内存分布
作者其他创作
大纲/内容
xx.class
本地接口JNI
自定义方法的调用执行
xx.java
getCalss()
Heap
栈顶帧(线程中的当前栈帧)
................
加载
栈帧-1(方法-1)
直接内存
运行时常量池
Metaspace元数据区(方法区)
堆Heap
入栈
①GC垃圾回收机制主要作用在伊甸园区和养老区②自JDK8之后,永久存储区更为元空间
Native Method Stacks本地方法栈
线程共享:生命周期是从虚拟机启动到虚拟机关闭
本地栈Navite Stack
局部变量表
Program Counter Register程序计数器
伊甸园区Enden space
准备
永久存储区
使用
幸存区1
扩展
java.class字节码文件
每条线程都有一个独立的程序计数器。唯一一个不会出现OOM的内存区域。JVM中的虚拟机栈是描述Java方法执行的内存区域,属【线程私有】。栈中的元素用于支持虚拟机进行方法调用,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。
虚拟机栈VM Stack
当前活动栈帧(栈顶帧)
虚拟机栈
方法返回地址
养老区
本地方法库
类只是一个模板
加载 初始化
线程私有:指这块区域归某个线程私有生命周期伴随着线程的生命周期
car1.getClass().getClassLoader=car2.getClass().getClassLoader
初始化
静态变量,常量,类信息(构造方法,定义接口),运行时类常量池都放在方法区中;实例变量放在堆内存中。final static
常量池
Heap堆
类加载过程
jdk8之后JVM内存划分
堆
线程私有
操作系统(Window,Linux,Mac)
方法区Method Area
S1
养老区新生区经过设定限制次数的轻GC生存下来的对象进入养老区
带有native关键字的类
JNI:扩展java的使用,融合不同的语言为Java所用
线程共享
栈帧-2(方法-2)
栈帧-i(方法-i)
解析
实例化对象 new Car()
getClassLoader
Car类
Young区新生代
出栈
程序计数器
新生区
程序计数器Program Counter Register
类加载:加载是一个读取class字节码文件,将其转化为某种静态数据结构存储在方法区内,并在堆中生成一个便于用户调用的java.lang.Class类型的对象的过程
执行方法
验证
卸载
Car Class
本地方法栈
类加载器ClassLoader
实例对象是不同的,但是他们都来自同一个类
操作栈
car1car2.......
jre-JVM
S0
永久区①这个空间常驻内存中,存放jdk自身携带的Class对象,interface元数据,存储的是java运行时的一些环境和类信息,这个区域不存在垃圾回收,关闭VM虚拟机才释放 ②JDK6之前:永久代,常量池在方法区中 ③JDK7: 提出去永久代,常量池放在堆中 ④JDK8之后:提出元空间,常量池放在元空间 ,一起放入直接内存
Eden
动态连接
幸存区0
klass类元信息
JVM Stacks
javac xx.java
Old区老年代
JVM Stacks虚拟机栈
JVM在编译中的作用位置
JIT编译产物
方法元信息
连接
运行时数据区
元数据区
新生区1.类的诞生成长甚至是死亡的区域2.伊甸园区:所有对象都在这new3.幸存区(幸存区0和幸存区1)
异常分派
执行引擎
。。。。。
收藏
收藏
0 条评论
下一页