Java笔记3.2--GC流程理解

字节码和跨平台特性:

.class格式的字节码形式运行

虚拟机可以屏蔽不同操作系统的差异

JDK是开发环境,JRE是运行环境

JRE中包括了Java虚拟机和Java程序运行时所需的核心类库

虚拟机结构:

JVM栈是现成私有的

堆区存放new出来的对象,jdk1.8中常量池和静态变量存在堆区

元数据存在本地内存

垃圾回收时的分代管理:

jdk1.8中,元数据区替代持久代

类的信息和编译后的代码数据等放元数据区

JVM内存调优是针对堆区而言,再进一步是针对年轻代和年老代

虽然Java会自动回收内存,但是仍可人为记性

内存回收流程:

1.new对象时现在Eden区申请内存,如果申请不到,在该区Minor GC(轻量级回收)

2.如果还申请不到,把Eden区里部分内存移到Survivor区,在Eden区分配空间(Minor GC(轻量级回收))

3.再不满足,把Survivor区里内容复制到Tenured区(Minor GC(轻量级回收))

4.如果Tenured区也满了,进行Full GC(重量级回收)

5.再分配不到,报OOM

MinorGC Full GC:

1.Minor GC是轻量级GC

2.调用System.gc()方法时,会触发Full GC(尽量避免Full GC)

3.能通过java命令分配堆空间的运行策略,比如能设置年轻代和年老代比例,如JVM监控到上次GC后,运行策略发生变化,会触发Full GC

4.System.gc()方法是告诉JVM可以进行回收,一般在之后很短时间执行GC但不是立即触发的(这是个建议,如果当时比较空闲或者内存剩很少)

判断对象可以被回收的标准:

1.对象上没有强引用(new的对象是强引用)

2.JDK早期版本是引用计数法,对象上没有引用计数就能被收回

3.引用计数法会导致循环依赖的对象无法被回收(创建a,b引用a,c引用b,a引用c)

4.后改为根可达算法(从根部搜索,搜索到的加标志,没有标志的就是可以回收的)

如下对象可以作为根部:

A.JVM栈里引用的对象(一个线程对应一个栈里的空间,线程作为根部去搜索)

B.本地方法栈里引用的对象(不常用)

C.静态变量和常量所引用的对象

总结:

对JVM,或者GC(垃圾回收)了解多少?

1.跨平台性(jdk开发环境,jre运行环境,.class是字节码,实现跨平台的基础)

2.讲述JVM结构,说明JVM1.8的改进(引入元数据区)

3.从分代管理的方式讲述GC流程

4.引出Minor GC和Full GC,说明哪些情况下会触发Full GC

5.JVM判断对象可被回收的方法(有强引用一定不会回收,如果弱引用,软引用可能被回收)

6.引用JVM性能调优和OOM话题

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/107664074