Java-JVM-八股文

发布时间 2023-07-16 17:49:16作者: 356a
  1. 线程共享区
  2. 堆区与方法区是所有线程共享的
    栈区:主要存放基本数据类型与对象引用(仅限局部变量,成员变量不管是不是基本数据类型都存放于堆)
    堆区:主要存放对象实例与数组[我的理解就是,由代码操作生成的对象或者说引用类型存放于堆]
    方法区:类信息(class文件)、静态变量与静态方法
    本地方法栈:非静态方法
    
  3. 如何排查JVM问题
  4. 空间:jmap 查看 JVM各个区域的占用情况,查看是否栈区过大?是否堆区过大?
    时间:jstack 查看线程的运行情况,是否存在死锁或者阻塞?
    OOM:
    查看: jstat 查看垃圾回收情况,fullgc 与 younggc 的运行情况
    记录: JVM启动参数 --> -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base,发生OOM的时候记录下当时的情况-dump文件,便于回溯定位问题
    分析:jvisualvm 可以针对dump文件进行分析异常对象,异常线程
    
  5. 从加载JVM到GC清理,一共经历什么过程-√
  6. 1.方法区加载字节码,加载静态方法、静态成员变量
    2.堆区创建实例化对象,保存至 年轻代 Eden 区
    3.将引用传回栈区
    4.经过minor GC,对象每次存活,年龄加一,并迁移至survival区-存活区,年龄大于等于15的时候,对象进入老年代
    5.栈区的引用被移除以后,对象最终被GC回收
    
  7. 如何确定对象是否需要回收
  8. 根可达算法:所有对象都是基于一个根对象上的,从根对象开始遍历,能找到引用的就是还需要的对象,否则就是不需要的对象。
    
  9. JVM垃圾回收机制
  10. 总共三种算法:
    标记:将所有对象判断是否根可达,将不可达对象标记并进行删除
    缺点:会有碎片空间出现
    
    复制法:申请一块与当前存储空间相同的空间,根可达算法标记所有存活对象,将存活对象迁移至新申请空间,迁移完毕以后,原空间统一清空
    缺点:需要的空间较大
    
    标记优化法:根可达算法标记所有存活对象,并将存活对象重新排列至连续空间,标记以及迁移排列完毕以后,将存活对象连续空间以外的空间统一清除
    
  11. 什么是STW
  12. STW,stop the world,即,在GC运行过程中,要将所有Java进程冻结,以便于GC进程进行垃圾回收。
    
  13. 常用的JVM启动参数有哪些?-※