jvm 内存结构
2022-02-23 16:32:35 0 举报
AI智能生成
jvm内存结构
作者其他创作
大纲/内容
方法区
概述
方法区用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等
方法区内部结构
类型信息(Class、interface、枚举(enum)、注解)
类型的完整有效名称(全名=包名+类名)
这个类型的父类的完整有效名(对于interface或Object,都没有父类)
这个类型的修饰符(public,abstract,final的某个子集)
这个类型直接接口的一个有序列表
域(Field)信息
JVM 必须在方法区中保存类型的所有域的相关信息以及域的声明顺序
域的相关信息包括:域名称、域类型、域修饰符(public、private、protected、static、final、volatile、transient 的某个子集)
方法信息
方法名称
方法返回类型
方法参数的数量和类型
方法的修饰符(public,private,protected,static,final,synchronized,native,abstract 的一个子集)
方法的字符码(bytecodes)、操作数栈、局部变量表及大小(abstract 和 native 方法除外)
异常表(abstract 和 native 方法除外)
每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引
运行时常量池
在加载类和结构到虚拟机后,就会创建对应的运行时常量池
常量池表(Constant Pool Table)是 Class 文件的一部分,用于存储编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
JVM 为每个已加载的类型(类或接口)都维护一个常量池。池中的数据项像数组项一样,是通过索引访问的
运行时常量池中包含各种不同的常量,包括编译器就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或字段引用。此时不再是常量池中的符号地址了,这里换为真实地址
运行时常量池,相对于 Class 文件常量池的另一个重要特征是:动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中,String 类的 intern() 方法就是这样的
方法区演进
jdk1.6之前,有永久代,静态变量存放在永久代上
jdk1.7有永久代,但已经逐步去永久代,字符串常量池、静态变量一处,保存在堆中
1.8及以后取消永久代,类型信息、字段方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中
方法区垃圾回收
设置方法区内存大小(1.8及之后)
元数据区大小可以使用参数 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 指定,
堆
堆内存划分
新生代
伊甸园 8
幸存区(from)1
幸存区(to) 1
老年代
元空间(JDK1.8前:永久代)
设置堆内存大小和OOM
-Xms 用来表示堆的起始内存,等价于 -XX:InitialHeapSize
-Xmx 用来表示堆的最大内存,等价于 -XX:MaxHeapSize
对象在堆中的声明周期
1.当创建一个对象时,对象会被优先分配到Eden区,此时jvm会给对象定义一个对象年轻计数器
2.当Eden空间不足时,jvm执行轻回收,把存货对象转移到幸存区中,并且对象年龄+1,对象在幸存区同样也会经历轻回收,每次对象年龄都+1
如果分配的对象超过了-XX:PetenureSizeThreshold,对象会直接分配到老年代
GC垃圾回收简介
Minor GC
Major GC
Full GC
TLAB
程序计数器:唯一一个没有oom情况区域
虚拟机栈
存储单位:栈帧
局部变量表
存储单位:槽slot
32位以内的类型只占用一个slot,64位的占用连续两个slot(byte、short、char在存储前转化为int,boolean也被转为Int,0为false,非0表示true)
jvm会为每个slot分配一个索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值,索引从0开始
如果需要访问局部变量表中的64bit的局部变量时,只需要使用前一个索引即可。
如果当前栈室友构造方法或实例方法创建的,那么该对象引用this将会存放在index为0的slot处(静态方法为什么不可引用this,就是因为this变量不存在与当前方法的局部变量中)
栈帧中的局部变量表中的slot是可以重用的
主要存储方法参数和定义在方法体内的局部变量,包括基本数据类型、对象引用
局部变量表需要的容量大小是编译器确定下来的
局部变量表中的变量只在当前方法调用有效,随着方法栈帧的销毁局部变量销毁
操作数栈:根据字节码指令,往操作舒展中写入或提取数据,后进先出
动态链接(指向运行时常量池的引用)
方法返回地址
正常执行完成
出现未处理的异常
附加信息
运行原理
本地方法栈
本地方法接口:一个native method 就是Java调用非java代码接口
本地方法栈:本质是栈,通Java虚拟Java栈类似,是用来管理本地方法的调用
0 条评论
下一页