jvm内存模型
2022-04-29 10:03:33 0 举报
JVM内存模型
作者其他创作
大纲/内容
方法区Method Area
Resolve
静态变量
运行时常量池
Eden区(8/10)
动态链接
S1(1/10)
Native Memory
新生代(1/3)
类信息 - 类的版本 - 字段描述信息 - 方法描述信息 - 接口和父类等描述信息 - class文件常量池(静态常量池)
- 类的版本- 字段描述信息- 方法描述信息- 接口和父类等描述信息- class文件常量池(静态常量池)
本地内存不受虚拟机内存参数的限制,只受物理内存容量的限制虽然不受参数的限制,但是如果内存的占用超出物理内存的大小,同样也会报OOM
执行引擎Execution Engine
jdk<1.8 永久代
堆
JVM参数: - 堆大小: -Xms -Xmx - 新生代: -Xmn - JVM栈: -Xss - 元空间: -XX:MetaspaceSize
堆Heap
JVM Stack
JVM栈Java Virtual MachineStack
.java
loading
操作数栈
Java编译器
S0(1/10)
方法区
Minor GC
本地接口Native Interface
运行数据区Runtime Data Area
栈帧n
线程私有,一个线程对应一个栈,生命周期与线程相同。
即时编译器JITComplier
元空间:本质与永久代(jdk1.8以前)类似,都是对JVM规范中方法区的实现;区别在于元空间不在JVM中,而是使用本地物理内存;永久代在JVM中,永久代逻辑上属于堆,但是物理上不属于堆,堆大小=新生代+老年代。元空间也有可能发生OOM。元空间大小可通过-XX:MetaspaceSize设置。
Extension ClassLoader
字符串常量池
元空间
本地内存Native Memory
Linking
方法出口
GC
栈帧2
局部变量表
两种GC: 1.Minor GC:发生在新生代的GC,GC主要通过复制算法实现 2.Major GC:也叫Full GC,发生在老年代。通常通过标记清除或标记整理算法实现。GC机制算法 1.复制算法 复制->清空->互换 新生代:Eden,S0, S1。 new的对象都放在Eden区,Eden区满了之后触发minor gc。 每次gc都会将Eden区中活的对象移到S0或S1,并且对象的年龄+1。假设此时移入S0。此时Eden为空。 Eden区满后再次触发gc。如果有活的对象进入另外一个空的幸存区,即S1。此时则把原来S0区的对象复制到S1,S0为空。此时S1为from区,S0为to区。 当一个对象经历了15次gc之后还没被清除,则进入老年代。该阈值MaxTenuringThreshold可以被调整。 注:Eden放不下,触发minor gc放到幸存区,幸存区放不下放到老年区,老年区放不下触发major gc,major gc没有则出现OOM 复制算法保证其中有一个幸存区为空;复制算法适合存活率较低的地方:新生区 好处:不会有内存碎片化 坏处:需要额外的空间 2.标记清除算法 JVM通过引用计数法或者可达性分析算法来判断一个对象是否被引用,当其不被引用时,则将其清除 好处:不需要额外的空间 坏处:会产生内存碎片,两次扫描严重浪费时间 3.标记压缩(整理)算法 标记清除算法的优化,再次扫描,向一端移动存活的对象,防止内存碎片的产生 好处:不会产生内存碎片 坏处:多一次移动成本GC算法:分代收集算法新生代:实例对象存活率低,使用复制算法老年代:区域大,实例对象存活率高,标记清除+标记压缩混合实现(多少次清除后进行一次压缩是JVM中GC算法调优的一个参数)
局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
User ClassLoader
类加载子系统
- 类的版本 - 字段描述信息 - 方法描述信息 - 接口和父类等描述信息 - class文件常量池(静态常量池)
登记Native方法,在Execution Engine执行时加载本地库
Java方法执行的线程内存模型,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
线程共享
Initialization
类加载后
.class字节码
Verify
BootStrap ClassLoader
栈帧1
程序计数器Program Counter Register
遵循双亲委派模型
线程私有
类装载子系统
Prepare
直接内存Direct Memory
本地方法区Native Method Area
方法区:线程共享,类的所有字段和方法字节码,以及一些特殊方法(如构造函数),接口代码也在此定义。简单来说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是非堆。jdk<1.8:Java虚拟机将堆内存划分为新生代、老年代和永久代,永久代是HotSpot虚拟机特有的概念。采用永久代的方式来实现方法区。永久代主要存放常量、类信息、静态变量等数据,与垃圾回收关系不大,新生代和老年代是垃圾回收的主要区域。jdk>=1.8:方法区采用元空间实现。静态变量,字符串常量池转移到了Java Heap类信息转移到了元空间(在Native MEmory中)
老年代(2/3
本地库Native Libraries
Application ClassLoader
老年代(2/3)
Full GC
PC用于存放当前线程接下来要执行的字节码指令、分支、循环、跳转、异常处理等信息。
永久代
垃圾收集器GC
jdk>=1.8
0 条评论
下一页