微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java虚拟机JVM的学习笔记——运行时数据区

java文件经过编译变成class文件,通过类加载器加载到JVM里面运行

JVM里面有一个重要组成部分就是运行时数据区

运行时数据区包括线程共享部分(堆、方法区),和线程私有部分(程序计数器、本地方法栈、虚拟机栈)


堆:存放对象实例 有eden区、from区、to区、老年代区(内存分配比例 8:1:1:?)

对象分配原则:
刚创建的对象通常都在eden区,但是一些大对象比如说字符串、数组,就会直接放到老年代区,不会再进行动态提升
在对象进行第一次垃圾回收之后,还存活下来的就会从eden区进入from区(一般回收率在90%左右)
而from区与to区采用的是复制回收的算法,就是在垃圾回收的时候把有用的放到另一个区,之后这个区的数据全部清理
这样就能提升垃圾回收的效率。
数据每在from区和to区转换一次,其对象头都会记录他的age+1,最高能到二进制数1111,也就是15次,此时就会进入到老年代
这就是长期存活的对象进入老年代

方法区:常量、静态变量等

程序计数器:记录该线程执行到哪一行代码,是JVM里面唯一一个不会OOM的区域,因为里面是int类型的数据,非常小。

本地方法栈:包含的是native方法,比如C++的一些方法

虚拟机栈:存储当前线程运行方法所需的数据、指令、返回地址
虚拟机栈使用到的 Native 方法就是由本地方法栈所服务的。
虚拟机栈里面包含N个栈帧,采取的方式是先进后出的原则(类似打枪上子弹)
每个栈帧相当于一个调用方法,包含局部变量表、操作数栈、动态链接方法出口等。
局部变量表存储的是八大基本数据类型以及‘引用类型’。
操作数栈每个数据需要操作的时候都要拿到操作数栈里面进行操作,完毕之后在放回去
动态链接指运行时常量池的方法引用

优化:

1、方法内联
2、公共数据共享(操作数栈与局部变量表)

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐