jvm

120 阅读2分钟

可以GC-root的对象:

       虚拟栈中引用的对象,静态变量引用的对象,常量引用的对象,本地方法区JNI引用的对象


java中的内部类是单独存在的,而且刚开始的时候不会跟随包含类一起被加载,等到要用的时候才被加载)

不被初始化的例子

1. 通过子类引用父类的静态字段, 子类不会被初始化
2. 通过数组定义来引用类
3. 调用类的常量(static final修饰的字段)


jvm内存分为:堆,方法区,栈,本地方法栈

堆:划分为新生代和老年代和永久代

新生代:新生代里又划分为Eden和Survivor(8:1)(SurvivorTo、SurvivorFrom),采用的是复制清理算法,当在SurvivorTo,SurvivorFrom复制一定次数后还生存的对象将移动到老年代里面(一次GC的过程:将Eden中存活的对象复制到SurvivorTo中,然后清除Eden中的内存,然后在SurvivorFrom中看有没有符合老年代的对象,如果有则移动到老年代中,然后将对象复制到SurvivorTo中,如果SurvivorTo满了,则复制到老年代中,然后调换SurvivorFrom和SurvivorTo,保证每次SurvivorTo都是空的等待对象的复制),这里的垃圾回收叫做minor GC

老年代:老年代中使用的是标记整理算法,这里的垃圾回收叫

永久代(方法区):这一块的GC条件比较苛刻,1、加载该类的classload被GC  2、该类的所有实例都已被GC  3、该类的java.lang.class没有被任何对象引用

发生GC:1、程序频繁创建对象,导致空间不足,程序需要分配较大的对象,找不到连续的内存空间,导致提前发生GC,程序调用system.gc()

垃圾回收算法:

   标记-清除:通过标记可清除对象,然后清除,易产生大量的内存碎片

   标记-整理:标记可清除对象,将存活对象往边界移动,然后清除边界以外的对象

   复制:将内存划为2部分,每次只使用其中一部分,发生GC时,将存活对象移到另一块内存中,然后清除。

   分代:将内存分为新生代和老年代,新生代采用复制清理算法,老年代使用的是标记-整理算法

   

https://blog.csdn.net/wk52525/article/details/79206799