模型 --HotSopt
jvm模型.png运行时数据分布.jpg
元数据空间并不在虚拟机中,而是使用本地内存
方法区--共享
- 已加载类信息
1)这个类型的完整有效名(全限定名) com.xxx.XxClass
2)这个类型直接父类的完整有效名(除非这个类型是interface或是java.lang.Object,两种情况下都没有父类)
3)这个类型的修饰符(public,abstract, final的某个子集)
4)这个类型直接超接口的一个有序列表(全限定名列表) - 常量
1)public static final int n = 1000; - 静态变量
1) private static ConcurrentHashMap local = new ConcurrentHashMap (); - 方法名
1) 方法的返回类型(或void)
2) 方法参数的数量和类型(有序的)
3) 方法的修饰符(public, private, protected, static, final, synchronized, native, abstract的一个子集)除了abstract和native方法外,其他方法还有保存方法的字节码(bytecodes)操作数栈和方法栈帧(栈以帧为单位保存线程的状态)的局部变量区的大小 - 域信息:也称成员变量,体现了类的状态,而状态的改变由类体的方法实现
1)域名
2)域类型
3)域修饰符(public、private、protected、static、final、volatile、transient的某个子集)
定义类的静态属性
- 类型的常量池( constant pool)
参考 https://blog.csdn.net/u010708434/article/details/10285643
栈--私有(jdk1.8 所有栈在一起)
- 虚拟机栈:线程私有,随线程创建而创建。栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操作数栈、方法出口等信息。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误。
- 本地方法栈:线程私有,这部分主要与虚拟机用到的Native方法相关,一般情况下,并不需要关心这部分的内容。
- 每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。
- 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。
- Java帧上的所有数据都是此线程私有的
参考: https://www.cnblogs.com/wade-luffy/p/5753057.html
堆 (Heap)
堆结构.jpg堆空间内存分配
2堆参数.png默认情况下
老年代 : 三分之二的堆空间
年轻代 : 三分之一的堆空间
eden区: 8/10 的年轻代空间
survivor0 : 1/10 的年轻代空间
survivor1 : 1/10 的年轻代空间
程序计数器
是一块较小的内存空间,他可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成
负责执行来自类加载器子系统(class loader subsystem)中被加载类中在方法区包含的指令集,通俗讲就是类加载器子系统把代码逻辑(什么时候该if,什么时候该相加,相减)都以指令的形式加载到了方法区,执行引擎就负责执行这些指令就行了
jvm执行引擎.jpg
本地库接口
(1)本地方法库接口:即操作系统所使用的编程语言的方法集,是归属于操作系统的。
(2)本地方法库保存在动态链接库中,即.dll(windows系统)文件中,格式是各个平台专有的
网友评论