卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与面向对象

  • 集合

  • 异常

  • 字符串

  • JVM

    • JVM的主要组成部分是什么?
    • JVM的内存结构?
    • JVM常见参数?
      • 简要回答
      • 详细回答
      • 知识图解
      • 知识扩展
    • 介绍一下类加载机制?
    • 介绍一下双亲委派机制?
    • 介绍一下强引用、软引用、弱引用和虚引用
    • 垃圾回收算法、机制
    • 常见的垃圾回收器有哪些?
  • 并发与多线程

  • JDK

  • Spring

  • 设计模式

# JVM常见参数

# 简要回答

  • JVM参数为JVM运行提供配置依据,可以对内存分配、垃圾回收、日志等方面进行配置,为不同的业务场景选择合适的参数。
  • 进行内存配置时可以使用 -Xms和 -Xmx设置堆内存的初始值和最大值; -Xmn设置新生代大小, -XX:NewRatio设置老年代与新年代比例;
  • 进行垃圾回收时可以使用 -XX:+UseParallelGC、-XX:+UseConcMarkSweepGC、-XX:+UseG1GC等参数进行垃圾回收器的选择。
  • 关于日志可以使用 -XX:PrintGCDetails打印GC详细信息,使用 -XX:PrintGCDateStamps打印GC日期和时间,还可以使用 -Xloggc:/path/to/gc-%t.log打印GC日志到指定文件。%t表示当前时间。
  • JVM参数也可以处理OOM异常,使用 -XX:+HeapDumpOnOutOfMemoryError可以在OOM时自动生成堆快照,使用 -XX:HeapDumpPath=/path/to/heapdump.hprof可以指定堆快照文件路径。

# 详细回答

  1. 内存配置
    • -Xms:设置JVM初始堆内存大小,例如-Xms1024m,需要设置数值和单位。
    • -Xmx:设置JVM最大堆内存大小,一般与-Xms参数设置相同,避免动态调整。
    • -Xmn:固定新生代内存大小,一般是堆内存的三分之一。
    • -XX:NewSize:设置新生代初始空间大小。默认情况下新生代大小为1310MB。
    • -XX:MaxNewSize:设置新生代最大空间大小。
    • -XX:NewRatio:设置老年代和新生代的内存大小比例。默认值为2,即老年代和新生代占比为2:1。
    • -XX:PermSize:设置永久代初始空间大小。
    • -XX:MaxPermSize:设置永久代的最大大小,超出则会抛出OOM异常。
    • -XX:MetaspaceSize:元空间阈值,当元空间使用量达到该阈值时,会触发Full GC,之后JVM会动态调整该阈值
    • -XX:MaxMetaspaceSize:设置元空间增长上限,默认值4096MB。
  2. 垃圾回收配置
    • -XX:+UseSerialGC:使用串行垃圾收集器,单线程执行GC,适用于客户端模式或者单核CPU环境。
    • -XX:+UseParallelGC:使用新生代并行收集器,不影响老年代垃圾回收,多线程执行新生代GC。
    • -XX:+UseParallelOldGC:使用老年代并行收集器,多线程执行老年代GC。
    • -XX:+UseConcMarkSweepGC:使用CMS垃圾收集器,以获取最短回收停顿时间为目标,大部分GC阶段可与用户线程并发执行。
    • -XX:+UseG1GC:使用G1收集器进行垃圾回收。
    • -XX:ParallelGCThreads:设置GC线程数,默认值为CPU核心数。
    • -XX:+UseZGC:使用ZGC进行垃圾回收,目标是将GC停顿时间控制在几号秒甚至更短时间内,适用于超大堆场景。
  3. 类加载配置
    • -verbose:class打印类加载信息
  4. 日志相关参数
    • -XX:+PrintGCDetails:打印GC详细信息。
    • -XX:+PrintGCTimeStamps:打印GC时间戳。
    • -XX:PrintGCDateStamps:打印GC日期和时间。
    • -Xloggc:/path/to/gc-%t.log:指定GC日志文件路径。%t表示当前时间。
  5. 处理OOM
    • -XX:+HeapDumpOnOutOfMemoryError:出现OOM时自动生成堆快照。
    • -XX:HeapDumpPath=/path/to/heapdump.hprof:指定OOM时生成的堆快照文件路径。

# 知识图解

  1. 运行时数据区示意图

# 知识扩展

  1. 扩展:
    • GC调优策略:
      1. 因为新生代垃圾回收的成本低,所以需要尽可能让新创建的对象在新生代分配内存并被回收,避免频繁Full GC。可以通过分析GC日志判断新生代空间分配是否合理。
    • 内存泄漏:
      • 程序在运行过程中不再使用的对象仍然被引用,无法被垃圾回收,导致可用内存减少。
      • 常见原因:
        1. 静态集合:使用静态数据结构存储对象,没有进行清理。
        2. 事件监听:未取消对事件源的监听,导致对象持续被引用。
        3. 线程:未停止的线程可能持有对象引用,无法被回收。
    • 内存溢出(OOM):
      • JVM申请内存时无法找到足够的内存,引发OutOfMemoryError。
      • 出现原因:
        1. 堆内存溢出:代码中出现大对象分配或者是内存泄漏时,多次GC也没有足够的内存空间。
        2. 栈溢出:代码中出现递归调用,压栈过深或者无法扩展栈空间时出现。
        3. 元空间溢出:系统的代码过多或加载的类文件过多,导致元空间内存占用大。
  2. 面试官可能追问:
  • Q1:秒杀高并发场景下你怎么进行参数配置?
    1. 秒杀高并发场景下需要避免GC停顿和内存浪费,采取固定堆大小,放大新生代和压缩老年代的方式。
    2. 将 -Xms和-Xmx设置为相同值,可以避免JVM在-Xms<-Xmx时进行动态扩容而触发Full GC,导致额外停顿,确保内存分配高效。
    3. 将 -Xmn设置为-Xms的1/2到2/3之间,秒杀会创建大量的临时对象,这些对象生命周期短,应该优先在新生代回收,防止对象过早的进入老年代,进而触发Full GC。还应该对新生代采用复制算法,可以容纳峰值时的短期对象。
    4. 可以压缩老年代的空间,因为秒杀场景下长期存活的对象少,尽量让对象在新生代回收可以减少停顿。
Last Updated: 3/10/2026, 6:08:48 PM

← JVM的内存结构? 介绍一下类加载机制? →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪