zoukankan      html  css  js  c++  java
  • 【年终大总结】JVM中的11组关系

    废话少说,直接开整:

    第1组:JDK、JRE、JVM的关系
    JDK中包含JRE,也包括JDK,而JRE也包括JDK。

    范围关系:JDK>JRE>JVM。

    具体见下图:

    第2组:.java文件与.class文件的关系
    这两者的关系需要两张图才能说明白:

    第3组:class文件与JVM的关系
    JVM通过类加载机制,把class文件装载进JVM中,然后JVM解析class文件的内容,于是就有了类加载过中的链接、初始化等。

    第4组:类加载器关系
    一张图来说明:

    第5组:方法区、堆、栈之间到底有什么关系
    直接上图:

    栈指向堆
    如果在栈帧中有一个变量,类型为引用类型,比如:

    package com.tian.my_code.test;

    public class JvmCodeDemo {
    public Object testGC(){
    int op1 = 10;
    int op2 = 3;
    Object obj = new Object();
    Object result=obj;
    return result;
    }
    }
    这时候就是典型的栈中元素obj指向堆中的Object对象,result的指向和obj的指向为同一个对象。

    使用命令

    javac -g:vars JvmCodeDemo.java

    进行编译,然后再使用

    javap -v JvmCodeDemo.class >log.txt

    然后打开log.txt文件

    方法区指向堆
    方法区中会存放静态变量,常量等数据。

    如果是下面这种情况,就是典型的方法区中元素指向堆中的对象。

    堆指向方法区
    方法区中会包含类的信息,对象保存再堆中,创建一个对象的前提是有对应的类信息,这个类信息就在方法区中。

    第6组:Minor、Major、Full GC的关系
    Minor GC:发生在年轻代的 GC。

    Minor GC是指从年轻代空间(包括 Eden 和 Survivor 区域)回收内存。当 JVM 无法为一个新的对象分配空间时会触发Minor GC,比如当 Eden 区满了。
    Eden区满了触发MinorGC,这时会把Eden区存活的对象复制到Survivor区,当对象在Survivor区熬过一定次数的MinorGC之后,就会晋升到老年代(当然并不是所有的对象都是这样晋升的到老年代的),当老年代满了,就会报OutofMemory异常。
    所有的MinorGC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。
    Major GC:发生在老年代的 GC。

    Major GC清理Tenured区(老年代)。
    Full GC:新生代+老年代,比如 方法区引起年轻代和老年代的回收。

    第7组:Survivor与Eden的关系
    对于这两者,最重要的是要明白为什么需要Survivor区?只有Eden不行吗?

    如果没有Survivor,Eden区每进行一次Minor GC ,并且没有年龄限制的话, 存活的对象就会被送到老年代。这样一来,老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。

    执行时间长有什么坏处?

    频发的Full GC消耗的时间很长,会影响大型程序的执行和响应速度。

    可能你会说,那就对老年代的空间进行增加或者较少咯。

    假如增加老年代空间,更多存活对象才能填满老年代。虽然降低Full GC频率,但是随着老年代空间加大,一旦发生Full
    GC,执行所需要的时间更长。

    假如减少老年代空间,虽然Full GC所需时间减少,但是老年代很快被存活对象填满,Full GC频率增加。

    所以Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16
    次Minor GC还能在新生代中存活的对象,才会被送到老年代。

    第8组:引用计数法和可达性分享算法的关系
    引用计数法
    给对象添加一个引用计数器,每当一个地方引用它object时技术加1,引用失去以后就减1,计数为0说明不再引用

    优点:实现简单,判定效率高
    缺点:无法解决对象相互循环引用的问题,对象A中引用了对象B,对象B中引用对象A。

    public class A {
    public B b;
    }
    public class B {
    public C c;
    }
    public class C {
    public A a;
    }
    public class Test{

    private void test(){
        A a = new A();
        B b = new B();
        C c = new C();
    
        a.b=b;
        b.c=c;
        c.a=a;
    }
    

    }
    可达性分析算法
    当一个对象到GC Roots没有引用链相连,即就是GC Roots到这个对象不可达时,证明对象不可用。

    GC Roots种类:

    ❝Java 线程中,当前所有正在被调用的方法的引用类型参数、局部变量、临时值等。也就是与我们栈帧相关的各种引用。所有当前被加载的 Java 类。Java 类的引用类型静态变量。运行时常量池里的引用类型常量(String 或 Class 类型)。JVM 内部数据结构的一些引用,比如 sun.jvm.hotspot.memory.Universe 类。用于同步的监控对象,比如调用了对象的 wait() 方法。

    第9组:对象的引用类型的关系
    强引用:User user=new User();我们开发中使用最多的对象引用方式。
    特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。
    通过关键字new创建的对象所关联的引用就是强引用。
    当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。
    对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,具体回收时机还是要看垃圾收集策略。
    软引用:SoftReference

  • 相关阅读:
    docer run 、docker attach 与 docker exec的区别
    filebeat-kafka:WARN producer/broker/0 maximum request accumulated, waiting for space
    json 格式要求
    词法分析
    CSS3 鲜为人知的属性-webkit-tap-highlight-color的理解
    DOMContentLoaded与load的区别
    用vue的自定义组件写了一个拖拽 组件,局部的 只能在自定义元素内的
    浮动元素遇到标准流元素 会发生转角遇到爱
    柯里化函数
    转载一篇关于toString和valueOf
  • 原文地址:https://www.cnblogs.com/tianweichang/p/14167397.html
Copyright © 2011-2022 走看看