和其他语言一样jvm需要管理一个供对象分配的内存空间。
为支持程序执行,JVM还需要提供一份内存空间作为函数调用栈。
jvm在启动时在内存中开辟空间,按照职能划分成不同的区域。
这些区域主要包括
堆 用来分配java对象和数组的空间。
方法区:存储类元数据。
栈:线程栈
PC寄存器:存储执行指令的内存地址
堆和方法区 共享区域 由JVM负责管理的
该区域的分配是HotSpot内存管理模块维护的,内存的释放由垃圾回收器自动完成。
栈和pc线程私有 在HotSpot中将栈和本地栈合二为一,是在本地内存空间中分配的。
为支持jvm检测 ,还准备一些额外的空间记录虚拟机自身状态,并允许外界程序读取这些信息。
堆
Java不允许程序员自己操作内存,内存管理统一由虚拟机处理。
无用的内存空间有虚拟机自动回收利用,垃圾收集的jvm组件叫做垃圾收集器。
堆 用于对象分配空间 按照年龄分为新生代和老年代区域。
非堆:包括方法区和code cache
Jconsole工具中 非堆为PermGen 和CodeCache
VM
在jdk8以后移除永久代 将原本存储于方法区的数据改为在本地内存中存储 JEP122
分代 依据对象生命周期差别 分代收集
新生代 YoungGen 堆 可分为一个Eden和两个Survior 其中一个from一个to
老年代 OldGen 堆
永久代 PermGen 非堆
Universe模块 Memory子模块 命名空间 持有JVM内部类型和对象
Universe 定义的成员和变量 源码为。。
线程私有区域 为线程调用函数栈服务的
栈反映程序运行位置变化
PC 反映的是执行指令的变化情况
线程启动JVM为每一个线程分配一个PC寄存器
HotSpot实现中 为每一个线程分配一个字节长的存储空间 实现类似于PC寄存器
并沿用了硬件的术语
一个线程只能执行一个方法中的代码 称为当前方法(currentmethod)
PC大小保存一个RETURN Adress类型的数据或者平台相关的本地指针。
如果不是本地方法 PC保存JVM正在执行的字节码指令的地址
如果是本地方法,PC中的值是未定义的,本地方法执行依赖于硬件PC 值是由操作系统维护的。
JVM栈 可用于存储栈帧 用于存储方法执行中的局部变量,中间演算结果、方法返回结果。
当进入一个方法,在栈顶分配一个数据区域;在退出时,撤销该区域
主要操作 出栈入栈 JVM规范允许栈帧在堆中分配 、对栈内存空间连续性没要求
JVM规范允许实现成固定大小或者运行时动态变化。
JVM实现应该提供配置栈帧容量的犯法
还有动态变化时的参数
请求分配栈容量超出最大容量 JVM抛出 StackOverflowError异常
如果扩展后还无法满足或者建立请求失败 会抛出OutMemoryError异常
方法区
类似于传统语言代码编译后的代码存储区 UNIX进程的正文段
它存储每个类的结构信息
例如
常量池
域
方法数据
方法和构造函数的字节码
类、实例、接口初始化用到的特殊方法。
在虚拟机启动创建。在实现位置没有要求
HotSpot仅在逻辑上独立区域
并且对方法区是否实现垃圾回收、以及编译代码采用何种管理方式也没有特别规定。
而在HotSpot中会垃圾收集此区域,回收过程主要关注常量池收集和对类的卸载。
方法区异常 如果方法区内存空间不满足内存分配请求 抛出OutOfMemoryError.
以字节码描述的java程序如何在JVM中存储和定位的 JVM执行引擎如何执行java程序???
JVM中如何描述java类型
方法区承载了java字段和字节码,通过引用堆中的对象以及围绕栈进行操作JVM指令,将各个区域连接起来,纽带作用。
最少存储包含两大类数据:类型基本描述信息和域(字段和方法)信息。
类型描述
类型全限定名
类型的直接超类全限定名 接口和object除外
是一个类类型还是接口类型
类型修饰符 public abstract final 等java关键字
一个已排序的接口列表。
类型主题信息
常量池
字段信息
方法信息
除常量外的staitic 类型变量
指向该类的类加载器的引用
指向该类的引用
字段名称
字段类型
字段描述
方法名
返回类型
方法参数个数和类型
方法描述
方法字节码
操作数栈的大小和本地变量
异常表
encodeBase64()方法指令在队中分配独享空间。
符号引用的获取问题
常量池 用来表示类中出现的符号信息
每一项是一个符号 每个符号都有一个class唯一的索引号
字节码指令通过常量池索引定位到方法字段的全限定名
invokevirtual
javap -v查看class文件的常量池
常量池在hotSpot中由ConstantPoolOopDesc类型表示
常量池的缓存ConstantPoolCache
方法的表示 methodOop 解析过后用方法表容纳方法定义
字节码使用ConstantMethodOop存储
代码放在ConstantMethodOop
性能监控区域PerfData
外部程序可以attach到虚拟机进程
转储技术 将运行时的程序快照拍下来为调试分析和诊断提供数据支持
转储类型分为3种
核心转储(core dump) 崩溃转储(crash dump)
堆转储(heap dump)
线程转储(thread dump)
作用:故障离线分析
后面总结的有点急 有机会了仔细结合工具分析