• java JVM虚拟机


    JVM垃圾处理方法(标记清除、复制、标记整理)

      1、标记清除

        标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象。

        清除阶段:清除所有未被标记的对象。

      2、复制算法

        将原有的空间分为两块,每次只使用其中的一块,将正在使用的内存中的存活的对象复制到未使用的内存块中,

        然后清除正在使用的内存块中的所有对象。

      3、标记----整理

        1.标记阶段:先通过根节点,标记所有从根节点开始的可达对象,为被标记的为垃圾对象

        2、整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有空间

       三种算法的比较

        1、效率:复制算法 > 标记/整理算法 > 标记/清除算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如 此)。

        2、内存整齐度:复制算法=标记/整理算法>标记/清除算法。 

        3、内存利用率:标记/整理算法=标记/清除算法>复制算法

    JVM如何GC,新生代,老年代,持久代都储存那些东西,以及各个区的作用?

      1、新生代

          在方法中去new一个对象,那这个方法调用完毕后,对象就会被回收,这个就是一个典型的新生代对象。

      2、老年代

          在经历了N次垃圾回收后仍旧存活的对象就会被放到老年代中。而且大对象直接直接进入老年代

          当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代

      3、永久代

          即方法区

    GC用的引用可达性分析算法中,那些对象可作为GC Roots 对象?

      1、java虚拟机栈中的对象

      2、方法区中的静态成员

      3、方法区中的常量引用对象

      4、本地方法区中的JNI(Native方法)引用对象。

    什么时候进行MinGC 、FullGC

      1、MinGC

          1》新生代中的垃圾收集动作,采用的是复制算法

          2》对于较大的对象,在Minor GC的时候可以直接进入老年代

      2、FullGC

          1》Full GC 是发生在老年代的垃圾收集动作,采用的是标记--清除/整理算法

          2》由于老年代的对象几乎都是在Survivor去熬过来的,不会那么容易死掉,因此Full GC发生的次数不会有Minor GC

            那么频繁,并且Time(Full Gc)>Time(Minor Gc)

    Java虚拟机内存的划分,每个区域的功能

      • 程序计数器(线程私有)

         ○ 线程创建时创建,执行本地方法时其值为undefined。

      • 虚拟机栈(线程私有)

         ○ (栈内存)为虚拟机执行java方法服务:方法被调用时创建栈帧-->局部变量表->局部变量、对象引用 ○ 如果线程请求的栈深度超出了虚拟机允  许     的深度,就会出现StackOverFlowError。-Xss规定了栈的大空间

        ○ 虚拟机栈可以动态扩展,如果扩展到无法申请到足够的内存,会出现OOM

      • 本地方法栈(线程私有)

        ○ java虚拟机栈是为虚拟机执行java方法服务的,而本地方法栈则为虚拟机执使用到的Native方法服务。

         ○ Java虚拟机没有对本地方法栈的使用和数据结构做强制规定。Sun HotSpot把Java虚拟机栈和本地方法栈合二为一

        ○ 会抛出StackOverFlowError和OutOfMemoryError

      • Java堆

        ○ 被所有线程共享,在Java虚拟机启动时创建,几乎所有的对象实例都存放到堆中

        ○ GC的管理的主要区域

        ○ 物理不连续,逻辑上连续,并可以动态扩展,无法扩展时抛出OutOfMemoryError

      • 方法区

        ○ 用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码的数据

        ○ Sun HotSpot 虚拟机把方法区叫做永久待(Permanent Generation)

      • 运行时常量池

        ○ 受到方法区的限制,抛出OutOfMemoryError 

    JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息

      • 常常需要在隔两分钟后再次收集一次thread dump,如果得到的输出相同,仍然是大量thread都在等待给同一个 地址上锁,那么肯定是死锁了。

        

  • 相关阅读:
    数据结构-栈
    virtualenvwrapper 的安装和使用
    MySQL命令行本地登陆,远程登陆MySQL 的快捷键
    关于mysql8授权的问题,mysql萌新小白采坑记录
    史上最直接小白式的Sourcetree的分支创建与合并
    验证两个集合是否相等的方法
    VS开发工具的常用插件
    C# 数据库并发的解决方案(通用版、EF版)
    Jquery实现div左右重复来回走动
    描述符的应用
  • 原文地址:https://www.cnblogs.com/XiDaPuBen/p/8872240.html
Copyright © 2020-2023  润新知