JVM整理详解编程语言

JVM问题

  1. JVM三大性能调优参数 -Xms -Xmx -Xss 的含义

    java -Xms128m -Xmx128m -Xss256k -jar -xxxx.jar 
    

    -Xss:规定了每个线程虚拟机栈(堆栈)的大小

    -Xms:堆的初始值

    -Xmx:堆能达到的最大值

  2. 内存分配策略

    静态存储:编译时确定每个数据目标在运行时的存储空间需求

    栈式存储:数据区需求在编译期未知,运行时模块入口确定

    堆式存储:编译时或运行时模块入口都无法确定,动态分配

  3. 堆和栈的区别

    管理方式:栈自动释放,堆需要GC

    空间大小:栈比堆小

    碎片相关:对产生的碎片远小于堆

    分配方式:栈支持静态分配和动态分配,而堆仅支持动态分配

    效率:栈的效率比堆高

  4. 不同JDK之间的String.intern()方法的区别 – JDK6和JDK6+

    • JDK6及之前:intern方法首先去查询常量池中是否存在该字符串,若有,返回的是对常量池中此字符串的引用;若无,在池中添加这个字符串,并且也返回对常量池中此字符串的引用

    • JDK6之后:也是先去查询常量池中是否有这个字符串,若有,同上;若无,情况相比JDK6就不同了,只会在常量池生成一个对堆里这个字符串对象的引用,且返回之。

    public static void main(String[] args) {
          
        String a4 = new String("AA"); 
        //String a5 = "AA"; 
        System.out.println(a4 == a4.intern());//注释掉上面一行就为false,反之为true 
     
    } 
    

    上面的例子就展示了这一点。

GC相关

  1. 判断对象是否死亡

    • 引用计数算法

      优点:执行效率高,程序执行受影响较小

      缺点:易产生死锁 – 两个对象循环调用,计数始终不为0

    • 可达性分析算法

      通过判断对象的引用链是否可达来决定对象是否可以被回收。

      可以作为GC Root的对象:

      • 虚拟机栈中引用的对象
      • 方法区中的常量引用的对象
      • 方法区中的类静态属性引用的对象
      • 本地方法栈中JNI(Native方法)的引用对象
      • 活跃线程的引用对象
  2. 谈谈了解的垃圾回收算法

    • 标记-清除算法:碎片多,不连续

    • 标记-清理算法

    • 复制算法:适用于对象存活率低的场景

    • 分代收集算法:

      年轻代:复制

      老年代:标记-清理

  3. GC分类

    • MinorGC – 年轻代

      一个Eden区,满了就复制算法,到survivor区;每次Minor GC,存货对象年龄+1,到达一定年龄(默认15岁)进入老年代;survivor区放不下时分配担保直接进老年代。

      两个Survivor区

      调优参数:

      • -XX:SurvivorRatio:Eden和Survivor的比值,默认8:1
      • -XX:NewRatio:老年代和年轻代内存大小的比例
      • -XX:MaxTenuringThreshold:对象从年轻代晋升到年老代经过GC次数的最大阈值
    • FULL GC和Major GC – 老年代

      触发条件:

      • 老年代空间不足
      • 永久代空间不足(JDK7及之前)
      • CMS GC时出现promotion failed, concurrent mode failure
      • Minor GC晋升到老年代的平均大小大于老年代的剩余空间
      • 调用System.gc()
      • 使用RMI(远程方式)来进行RPC来管理的应用,每隔一小时
  4. 常见垃圾收集器

    新生代常用

    Serial收集器(-XX:+UseSerialGC,复制算法)

    • 单线程,有停顿时间
    • 简单高效

    ParNew收集器(-XX:+UseParNewGC,复制算法)

    • 多线程,其余行为特点和Serial一样
    • 单核下没有Serial效率高

    Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)

    • 更关注系统吞吐量
    • 多核有优势,Server模式下默认

    老年代常见

    Serial Old

    Parallel Old(-XX:+UseParallelOldGC,标记-整理算法)

    • 多线程,吞吐量优先
    • 配合Parallel Scavenge

    CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)

    无法和Parallel Scavenge配合

    • 初始标记:stop-the-world
    • 并发标记
    • 并发预清理
    • 重新标记:stop-the-world
    • 并发清理
    • 并发重置

    G1收集器(-XX:UseG1GC,复制+标记-整理算法)

    • 将整个Java堆内存划分成多个大小相等的Region
    • 年轻代和老年代不再物理隔离

GC问题

  1. finalize方法

    给予对象一次重生机会。不建议使用

  2. 四个引用

    • 强引用:Object obj = new Object()

      抛出OOM也不会回收

      要回收,需要设置为null来弱化引用

    • 软引用(SoftRefence)

      有用非必须

      当内存空间不足时,GC会回收该引用的对象的内存

      可以用来实现高速缓存

    • 弱引用(WeakRefence)

      非必须

      GC被收回

    • 虚引用(PhantomRefence)

      不会决定对象的生命周期

      任何时候都会被引用

      作标记用途,对象被收回时会有一个通知

    引用队列(ReferenceQueue)

    • 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达
    • 存储关联的且被GC的软引用,弱引用以及虚引用

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/19385.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论