JVM体系

JVM体系结构概括

  • 在这里插入图片描述

  • 在这里插入图片描述

  • JVM的类加载器

    /**
     * 虚拟机自带的加载器
     * 启动类加载器(Bootstrap)    -----C++
     * 扩展类加载器 (Extension)     -----Java
     * 应用程序类加载器(AppClassLoader) ---java也叫系统类加载器,加载当前应用的classpath的所有类
     * --------------------
     * 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式
     */
    public class MyAppClassLoader {
    
        public static void main(String[] args) {
            Object object = new Object();
    //        System.out.println(object.getClass().getClassLoader().getParent().getParent());
    //        System.out.println(object.getClass().getClassLoader().getParent());
            System.out.println(object.getClass().getClassLoader());
    
            MyAppClassLoader myAppClassLoader=new MyAppClassLoader();
            System.out.println(myAppClassLoader.getClass().getClassLoader().getParent().getParent());
            System.out.println(myAppClassLoader.getClass().getClassLoader().getParent());
            System.out.println(myAppClassLoader.getClass().getClassLoader());
        }
    }
    结果:
    null
    null									   启动类加载器
    sun.misc.Launcher$ExtClassLoader@16d3586   扩展类加载器
    sun.misc.Launcher$AppClassLoader@dad5dc    用户自定义的类加载器
    
    • 总结:java核心包就是java.xxxx 是最底层搞定c/c++编写的启动类加载器,后续根据功能的加强和扩展,展开了扩展,为javax.xxxx,为扩展类加载器。也可后续定义自己的应用程序类加载器。加载当前应用的classpath的所有类(内有双亲委派机制,和沙箱安全机制)
    • 关键点
      • (1):什么是类加载器
      • (2):有哪四种
      • (3):双亲委派机制
      • (4):沙箱安全机制
  • 方法栈在jdk1.8前叫方法栈,1.8后叫元空间

    • ​ Native :是一个关键字;声明有,实现无,(创建一个Native的方法栈,调用底层的c代码或者c++代码【java创建于1995年,最初必须使用c的代码】)
      • PC寄存器

        • 记录了方法之间的调用和执行情况,类似排版值日表:用来储存指向下一条指令的地址,也即将要执行的指令代码,他是当前线程所执行的字节码的行号指示器
  • 方法区和堆是线程共享,非线程私有的,其余的都是线程私有,存储每一个类的结构信息在这里插入图片描述
    方法区:储存了每一个类的结构信息

    ​ 方法区是规范,在不同虚拟机里头实现是不一样的,最典型的就是元空间和永久代

在这里插入图片描述

    • 栈管运行,堆管存储
    • 栈保存的东西:八种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存分配的
    • 栈帧:进入栈的方法,称为栈帧
    • 容易出现的栈 错误:栈内存溢出的错误,----该错误定义在java.lang.error下的java.lang.VirtualMachineError下的java.lang.StackOverFlowError,本质为错误,非异常
    • 栈帧:进入栈的方法,称为栈帧
    • HotSpot是使用指针的方式来访问对象,java堆中会存放访问类元数据的地址,reference存储的就是对象地址

程序=算法+数据结构

程序=框架+业务逻辑 (工作者)

    • 堆内存逻辑上分为三部分:新生+养老+永久
    • 物理上分为五部分:伊甸区 - > 幸存零区 - > 幸存一区 - > 养老区 - > 元空间(jdk1.8后)

jdk8后的虚拟机:在这里插入图片描述

元空间和永久代的区别:在这里插入图片描述

配置VM

配置新生代,养老代的内存空间VM: -Xms1024m -Xmx1024m -XX:+PrintGCDetails

写出报OOM错误的代码:byte[] bytes=new byte[40 * 1024 * 1024]; 会直接报:

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

GC回收

  • ​分代收集算法
    • ​ {
    • 次数频繁收集的Young区
    • 次数比较少的old区
    • {基本不动的元空间
      } ​
  • 算法 {
    • ​ 1 引用计数法
    • ​ 2 复制算法 优点:不产生内存碎片 缺点 :复制交换损耗了大量空间
    • ​ 3 标记清除 优点:节省很多空间 缺点 :进行了俩次扫描,耗时严重,会产生内存碎片
    • ​ 4 标记压缩 —在标记清除的基础上配上了整理内存碎片 缺点:浪费大量时间整理,效率上低于复制算法
      ​ }
    • 特: 标记清除压缩 标记清除和标记压缩的结合,和标记清除一样,当多次gc后才会压缩(不算入算法中)

面试中遇到使用什么算法,回答分代收集算法,在新生代上使用复制算法,在老年代使用标记清除,标记压缩算法

未完待续------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值