• JVM总结


    对JVM的理解?

    JVM虚拟机它能够将.class文件解释为可供机器执行的机器码,它使得Java可以跨平台的执行,因为由它屏蔽了各个平台软硬件的差异。

    Java内存模型由哪几部分组成?并分别解释他们的作用。

    堆、方法区、虚拟机栈、本地方法栈、PC计数器。
    PC计数器:一块较小的内存空间, 是当前线程所执行的字节码的行号指示器。这里是唯一一个不会产生oom的区域。
    虚拟机栈:描述java方法执行的内存模型,每个方法在执行的同时都会记录一个栈帧。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    本地方法栈:描述native方法执行的内存模型。
    堆:存储对象、数组。其中存储对象的可以被划分为新生代、老年代,其中新生代又被划分为eden区、from survivor区和to survivor区。
    方法区(永久代):用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    哪些是线程私有?哪些是线程共享?

    线程私有:虚拟机栈、本地方法栈、PC计数器。
    线程共享:堆、方法区。

    堆的结构

    1/3的新生代和2/3的老年代,新生代中eden占8/10,from survivor占1/10,to survivor占1/10。

    MinorGC的过程

    采用复制算法
    1.首先,把eden区和from survivor区的存活对象移到to survivor区(如果有对象达到了年龄就放到老年代区),同时把这些对象的年龄+1岁(如果当to survivor区地方不够时,也移到老年代)。
    2.清空eden区和from survivor区的对象。
    3.to survivor区将成为下一次的from survivor区,from survivor区将成为下一次的to survivor区。

    MajorGC的过程

    采用标记清除算法
    扫描一遍老年代,标记出存活的对象,然后回收没有标记的对象。

    jdk8与元数据

    在jdk8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间并不在虚拟机中,而是使用本地内存。类的元数据放入native memory, 字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

    垃圾回收算法?

    标记-清除算法:标记被引用的对象,然后直接清除掉未被引用的。
    缺点:会产生内存碎片,而且标记和清除这两个过程效率都比较低。

    标记-整理算法:标记被引用的对象,并把它们移动到一边,清除掉另一边的垃圾对象。
    优点:不会有内存碎片,进而提升了对象创建分配内存的速度。
    缺点:标记和整理的效率都不高。

    复制算法:使用两块内存区域,先使用一块区域,当这块区域内存满了之后,将存活下来的对象放到另一块区域。
    优点:没有内存碎片,且效率高。
    缺点:浪费一半空间,在对象存活率较高时就要进行较多的复制操作,效率将会变低。

    分代收集算法:以HotSpot为例,在新生代、生存者0区和生存者1区使用复制算法,因为这三个区域会有大量的对象不再被引用。而在老年代则使用标记清除或者标记整理算法。

  • 相关阅读:
    党史回顾+十九大习思想+中国历史事件+地理+航天史及古代天文历法
    国际组织
    生活-常识-物理
    生物
    数量题目总结-利润排列组合
    数量题目总结-工程最值集合
    考公错题记录表
    个人向简历介绍
    数据库操作大全
    团队博客作业-技术规格说明书
  • 原文地址:https://www.cnblogs.com/fxw-learning/p/13834106.html
Copyright © 2020-2023  润新知