JVM运行时数据区
总体分为三类
运行时数据区:程序计数器,JAVA STACK ,NATIVE METHOD STACK,METHOD AREA,HEAP
线程不共享:程序计数器,JAVA STACK,NATIVE METHOD STACK
线程共享:METHOD AREA,HEAP(非线程安全)
程序计数器:操作系统中我们学过,进程上CPU执行是看分配的时间片大小的,同理线程也是一样的,那么当线程没有分配到时间片的时候需要有一个记录运行状况的计数器
当前线程所执行的字节码行号指示器
字节码解释器工作依赖计数器控制完成
线程执行Nativan方法时,计数器记录为空(Undefined)
本地方法栈:native方法
虚拟机栈:不同线程间方法栈不共享,每个方法执行都会创建一个栈帧用来存放局部变量,操作数表,动态连接,方法出口等信息,每个方法从调用入栈直至执行完成出栈。
堆:所有的线程共享一块内存区域。
方法区:线程共享方法区,方法区用于储存虚拟机加载的类信息,常量,静态常量和编译器编译后的代码等数据,这里可以看到常量也会在方法中,是因为方法区中又一个运行时常量池,为什么叫运行时常量池,因为在编译后期生成的各种字面量(int i =3,3就是字面量)和符号引用,这些是存放在一个叫做常量池的地方,当类加载进入方法区时,就会把该常量池中的内容放入运行时常量池中
创建对象方式:
指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存度放一边,空闲的内存放另一边,中间放着一个指针作为分界点的指示器,所分配内存就仅仅是把哪个指针向空闲空间那边挪动一段与对象大小相等的举例,这种分配方案就叫指针碰撞
空闲列表:有一个列表,其中记录中哪些内存块有用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,然后更新列表中的记录。这就叫做空闲列表
对象的访问定位:
句柄访问:Java堆中会划分出一块内存来作为句柄池,引用变量中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息
文章图片
直接指针访问:引用变量中存储的就直接是对象地址了
【JVM运行时数据区】
文章图片
推荐阅读
- jvm关于String
- jvm常见分析工具
- 08_JVM学习笔记_类命名空间解析
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- jvm常用命令
- Android免Root|Android免Root 修改程序运行时内存指令逻辑(Hook系统函数)
- iOS-OC运行时
- JVM监控工具教程
- jvm|jvm 谈谈引用(强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference))
- jvm|JVM调优(线上 JVM GC 频繁耗时长,出现 LongGC 告警,这次排查后想说:还有谁(...))