JVM常见问题

本文深入探讨了JVM的内存结构,包括线程共享的堆、方法区和线程私有的虚拟机栈等。详细阐述了类加载过程,垃圾回收算法如标记清除、复制等,以及CMS和G1垃圾收集器的工作原理。同时,讨论了JVM调优的关注点,如停顿时间和吞吐量,并介绍了如何设置JVM堆大小。此外,还涉及了CPU占用过高时的分析方法和内存溢出的分析技巧。
摘要由CSDN通过智能技术生成

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. 对象在堆中的组成结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值