运行时数据区

和其他语言一样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)

作用:故障离线分析

后面总结的有点急  有机会了仔细结合工具分析















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值