Java基础-3、JVM

目录

 

运行时数据区域、JMM(JVM内存模型)

Minor GC、Full GC

各种回收算法

类加载,为何使用双亲委派模式?是否有场景可以打破这种模式?

Finalize()方法


运行时数据区域、JMM(JVM内存模型)

 

Minor GC、Full GC

 

Minor GC 新生代

Full GC/Major GC 老年代

-XX:+UseSerialGC

串行GC

串行GC

-XX:+UseParallelGC

PS GC

并行MSC GC

-XX:+UseConcMarkSweepGC

ParNew GC

并行GC

当出现concurrent Mode

Failure时采用串行GC

-XX:+UseParNewGC

并行GC

串行GC

-XX:+UseParallelOldGC

PS GC

并行Compacting GC

-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC

串行GC

并发GC

当出现Concurrent Mode

Failure或promotion failed时采用串行GC

不支持的组合方式

1、-XX:+UseParNewGC -XX:+UseParallelOldGc

2、-XX:+UseParNewGC -XX:+UseSerialGC

判断对象是否“存活”或“死亡”:

  1. 引用计数算法:

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加1;当引用失效时,计数器的值减;当该对象的计数器的值为0时,标志该对象失效。

  1. 跟搜索算法:

通过一系列的名为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明对象是不可用的。

各种回收算法

  1. 标记-清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象

  1. 复制算法

将可用内存按容量划分为大小相等的两块,每次使用其中的一块,当一块的内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清空(Eden和Survivor)

  1. 标记-整理算法

标记过程仍然与标记-清除算法一样,让所以存活对象都向一端移动,然后直接清理掉边界意外的内容

  1. 分代收集算法

类加载,为何使用双亲委派模式?是否有场景可以打破这种模式?

类的生命周期:

类加载双亲委派模型

破坏双亲委派模型:线程上下文类加载器(Thread Context ClassLoader)

Finalize()方法

是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。

class TestGC{
   
public static TestGC testGC = null;
   
public static void main(String[] args) throws InterruptedException {
       
testGC = new TestGC();
       
testGC = null;
        System.gc();
        Thread.sleep(
500);
       
if (null != testGC) { //此时对象应该处于(reachable, finalized)状态
           
System.out.println("Yes , I am still alive");
        }
else {
            System.
out.println("No , I am dead");
        }
       
testGC = null;
        System.gc();
        Thread.sleep(
500);
       
if (null != testGC) {
            System.
out.println("Yes , I am still alive");
        }
else {
            System.
out.println("No , I am dead");
        }
    }
   
@Override
   
protected void finalize() throws Throwable {
        
super.finalize();
        System.
out.println("execute method finalize()");
       
testGC = this;
    }
}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章