JVM(3)线程共享区
方法区
类信息
常量
静态变量
及时编译期编译后的代码(运行时编译的 如:动态代理添加的)
Java堆
对象实例
数组
Java堆的大小参数设置
-Xmx 堆区内存可被分配的最大上限
-Xms 堆区内存初始内存分配的大小
JMM? 叫JVM的内存模型
基于分代的思想
堆
新生代(堆空间的1/3)
- Eden 空间(8/10)
- From Survivor空间(1/10)
- To Survivor空间(1/10)
老年带(堆空间的2/3)
方法区
永久代(JDK1.8版本以前叫法) == 元空间(JDK1.8版本和以上版本的叫法)
JMM--对象内存分配
对象 优先在Eden分配
长期存活的对象将进入老年代
大对象直接进入老年代
动态对象年龄的判定
JMM--对象的回收----判断对象的存活
引用计数算法
可达性分析法(有引用与没有引用判断是否可达:基于GC Roots)
在Java,可作为GC Roots的对象包括:
1.方法区: 类静态属性引用的对象;
2.方法区: 常量引用的对象;
3.虚拟机(本地变量表)中对象;
4.本地方法栈JNI(Native方法)中引用的对象
JVM中的垃圾回收(GC)
新生代
Minor GC(除了定时回收以外--->触发条件:当新生代Eden空间不足时)
对应 ---> 复制回收算法(使用率只有50%)(特点:速度快;缺点:浪费空间50%)
适合大部分对象都不需要回收
(90%的对象不用区垃圾回收的,只有10%对象需要去垃圾回收)
所以 JVM新生代里做了10%空间的预留区 所以最后空间被分成了 8:1:1 的大小
老年代
Full GC(全盘清扫)(优先使用标记清除,如果清除以后碎片过多就会使用标记整理)
标记清除算法(会带来内存碎片)
标记整理算法
永久代
会不会进行垃圾回收? 会 (发生条件比较严格)
垃圾回收的算法
- 1.复制回收算法
- 2.标记清除算法
- 3.标记整理算法
元空间
元空间过大会挤占堆的空间