1.程序计数器:指向当前线程执行的字节码指令文件的地址和行号
为了在cpu将线程挂起,进行线程切换时,能够记录当前线程的执行进程,正确安全的执行完.
2.虚拟机栈:(存储当前线程运行的方法的栈帧,只有等方法执行完栈帧才会出栈) 测试看在同一给方法中的多个方法.
用来执行对应的方法所需的数据,通过对方法的划分又细分为栈帧.
注意:由于虚拟机栈在数据结构中算是栈,有着先进后出的特点
每个虚拟机栈又可细分为
1)局部变量表:32位 8大基础数据类型 double/long(64):分为高32位,和低32位 存储对象的引用地址(取址范围为2的32次方 4g)
2)操作数栈:存放方法的
3)动态链接:与java的多态有关
4)返回地址:
补充:
1.jdk1.7以后,静态String
2.线程共享:方法区(静态,常量,类信息).堆(对象,数组)
3.jdk小于1.8的 JMM:JVM的内存模型,(思想:年龄分代) 永久代:方法区 , 新生代和老年代为堆
4.jdk1.8以后 永久代被元空间取代
5.JMM分配原则: 分配优先往下
1)对象优先在eden区
2)大对象直接进入老年代
3)长期存活的对象进入老年代
6.在虚拟机的配置文件中虚拟机栈为xss 大小为1m
-xms 300m 设置堆的内存大小初始为300m,最大为300m
-xmx 300m 新生代默认为堆内存的1/3,老年代为2/3
新生代内又划分为 8:1:1 eden:s0:s1
s0和s1时交换区,采用的复制算法
7.gc
1)如果进行了一次gc后还存活,age+1,然后进入新生代中的s0区
2)GC会根据区域的剩余内存进行判断是否进行清理
3)如果age等于15时,进入老年代,长期存活的对象进入老年代
4)动态年龄判断:如果s0中有一部份的对象的内存大于它的50%,则将年龄大的放进老年代
8.空间分配担保:在将新生代放进的老年代的对象中,
悲观 老年代频繁发生GC,会发生STW(stop the world)现象,会停止所有线程进行gc
乐观 (老年代进阶对象,不会触发GC)
9.GC算法
1)复制算法:将空间划分为两份,一个预留,一个实际,在进行GC时,将预留的开启,将没被删除的放进预留的内存块,将实际的转换为预留的
2)标记清除算法:在GC的过程中,将要删除的标记删除,但会产生内存碎片
3)标记整理算法:在标记删除后,还进行整理,但效率偏低
10.判断对象是否为垃圾的依据:
1)判断对象是否可达GCROOTS
11.内存泄漏:
方法里new出了很多gc垃圾回收器回收不了的对象
12深堆和浅堆:
深堆释放的对象内存大小多余它自己,浅堆只是释放的自己的内存空间