JVM常见问题

Posted 若甘年后

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM常见问题相关的知识,希望对你有一定的参考价值。

JVM

1. jvm内存结构

  • 线程共享
    • 方法区 MetaSpace
      • 运行时常量池
      • 类的信息,包括类名、参数、方法等
      • 类的常量
      • 类的静态变量
    • 堆 Heap
      • 老年代 Old Space
      • 新生代 Young Space
        • Eden -8
        • S1-1
        • S2-1
  • 线程私有的
    • 虚拟机栈
      • 本地变量表
      • 操作数栈
      • 动态链接 一些动态生成的链接地址等,类似于符号引用变直接引用
      • 返回地址(包括正常的和异常的)
    • 本地方法栈
    • 程序计数器

2. JVM垃圾回收算法,垃圾回收器,G1,CMS回收过程,虚拟机怎么保证分配内存时的线程安全

  • 标记清除
  • 标记整理
  • 标记复制

3. JVM类加载

类加载是指把.class 文件加载到jvm虚拟机的过程,主要包括以下几个步骤

  • 加载 Loading 根据类的全限定名从磁盘或者网络上加载二进制流(十六进制编码)

    此处主要是使用Java的ClassLoader 即类加载器进行加载,常用的类加载器分为以下几个部分

    • BootStrap ClassLoader 即根加载器,主要加载rt.jar的类
    • Extention ClassLoader 即扩展类加载器, 主要加载.ext下的jar
    • Application ClassLoader 即应用类加载器,加载当前classpath下的类
    • Custom ClassLoader 即自定义类加载器
  • 链接 Linking

    • 验证 Verification 验证类文件的格式,比如开头是否是cafebabe等 包括有对应的词法语法解析器
    • 准备 Preparing 给类的静态变量初始化空间并赋值初始值
    • 解析 Resovling 把一些符号引用转化为内存中的直接引用
  • 初始化 Initialization

    给类的静态变量赋值

    MethodNotFoundException、ClassNotFoundException、ClassDefNotFoundException分别发生在哪个步骤?

4. 垃圾收集器

  • Serial 新生代 使用标记复制 单线程

  • Serial Old 老年代 使用标记整理 单线程

  • ParNew 新生代 使用标记复制,基于Serial 多线程收集

  • Parallel Scavenge 新生代 使用标记复制,更关注吞吐量

  • Parallel Old 老年代 标记整理,关注吞吐量

  • CMS收集器 老年代 使用标记清楚算法 关注停顿时间,整个过程stw 两次

    • 先初始标记 stw (每一步具体做了什么???)

    • 然后并发标记

    • 重新标记 stw

    • 并发清除

      并发:用户线程和垃圾回收线程可以并行执行 成为并发

  • G1 并发收集器 1.9默认 可以设置具体的停顿时间,会更改jvm的内存区域,划分成大小相等的独立区域

    相比cms 是在cms 并发清楚的时候这一步进行筛选回收,主要是因为用户设置了停顿时间,所以只能选择性的回收。

    • 堆内存的存活率超过了50%
    • 对象的分配和晋升速度变化大
    • 垃圾回收时间长

5. JVM调优(你是怎么去做jvm调优的)

  • GC收集器:停顿时间和吞吐量

    • 停顿时间: 垃圾回收所使用的的时间
      • CMS G1 停顿时间较小 适用于web应用 并发类的收集器
    • 吞吐量: 吞吐量 = 运行用户代码的时间/(运行用户代码的时间+垃圾回收时间)
      • Parallel Scavenge Parallel Old 并行类的收集器
  • 内存的使用维度

6.如何设置JVM堆的大小

正常来说默认JVM堆的大小=老年代的大小+新生代的大小,默认比例为2:1, 老年代的大小可以设置成老年代FULL GC后存活对象总大小的3到4倍,元数据区域的大小可以设置为老年代存活对象总大小的1.2倍到1.5倍左右,可以通过JVM启动参数 加入GC日志来观察每次FULL GC后的对象总大小,或者通过JMAP -dump命令下载内存快照强制触发full gc 并通过快照分析。

7. 如果jsp的CPU占用过高如何去分析?

8. Jvm内存溢出怎么分析?

9. Happens Before

  1. Volatile 规则
  2. a happens before b , b happens before c 则 a happens before c
  3. 单线程的程序顺序规则
  4. 线程的start规则,线程start前面的程序一定对线程内部是可见的
  5. 线程的join规则,
  6. 锁规则,synchronize规则

10. 对象在堆中的组成结构

以上是关于JVM常见问题的主要内容,如果未能解决你的问题,请参考以下文章

【翻译】JMV GC 停顿时间过长问题排查

jvm调优

JVM之GI收集器

[转]JVM系列三:JVM参数设置分析

《深入理解JAVA虚拟机》垃圾回收时为什么会停顿

阿里面试100%问到,JVM性能调优篇