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、公共数据共享(操作数栈与局部变量表)
运行时数据区图
虚拟机栈图