jvm第二节-jvm参数设置和跟踪

本文详细介绍JVM的各种参数设置,包括垃圾收集器的跟踪配置、堆内存分配策略、永久代及栈空间的设置方法等,帮助读者更好地理解并合理配置JVM。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.jvm跟踪设置

 

打印GC信息

-verbose:gc

-XX:+PrintGC

 

-XX:+PrintGCDetails 打印详细GC信息

-XX:+PrintGCTimeStamp打印GC发生的时间戳

 

Xloggc:log/gc.log 记录gc日志

 

-XX:+PrintHeapAtGC打印GC前后堆使用情况

-XX:+TraceClassLoading 监控类加载

-XX:+PrintClassHistogram 按下Ctrl+Break后打印所有类的使用情况

 

2.堆的分配参数设置

-Xmx20m -Xms5m ,意思是最大堆内存和分配20m,初始化分配5m,这样设置jvm就会通过gc来保证最小分配堆一一直尽量在5m,可能降低系统的性能,我们可以根据根据实际情况来设置初始化堆,jvm的最大堆和当前系统已分配的最大堆是不一样的。

 

-Xmn

设置新生代大小

-XX:NewRatio

新生代(eden+2*s)和老年代(不包含永久区)的比值

4 表示 新生代:老年代=1:4,即年轻代占堆的1/5

-XX:SurvivorRatio

设置两个Survivor区和eden的比

8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10

 

jvm参数设置的例子

 -Xmx20m -Xms20m -Xmn1m -XX:+PrintGCDetails

public class HeapTest {

	public static void main(String[] args) {
		   byte[] b=null;
		   for(int i=0;i<10;i++)
		       b=new byte[1*1024*1024];
		}

}

 堆栈信息:

Heap

 PSYoungGen      total 512K, used 0K [0x00000000fff00000, 0x0000000100000000, 0x0000000100000000)

  eden space 0K, -2147483648% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff00000)

  from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)

  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)

 ParOldGen       total 19456K, used 10855K [0x00000000fec00000, 0x00000000fff00000, 0x00000000fff00000)

  object space 19456K, 55% used [0x00000000fec00000,0x00000000ff699fe8,0x00000000fff00000)

 PSPermGen       total 21504K, used 2520K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)

  object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c763c8,0x00000000faf00000)

可以看出新生代的from和to个分配空间512k都没释放,老年代使用了10m空间,至于为什么新生代总空间是512k这点我现在还在迷糊,求解释。。。

下面我们调整下jvm参数:-Xmx20m -Xms20m -Xmn5m -XX:+PrintGCDetails

堆栈信息:

 

[GC [PSYoungGen: 3832K->504K(4608K)] 3832K->1552K(19968K), 0.0012854 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

[GC [PSYoungGen: 3665K->504K(4608K)] 4713K->2576K(19968K), 0.0032564 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

[GC [PSYoungGen: 3607K->504K(4608K)] 5679K->3608K(19968K), 0.0082467 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 

Heap

 PSYoungGen      total 4608K, used 1610K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)

  eden space 4096K, 27% used [0x00000000ffb00000,0x00000000ffc14820,0x00000000fff00000)

  from space 512K, 98% used [0x00000000fff00000,0x00000000fff7e010,0x00000000fff80000)

  to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)

 ParOldGen       total 15360K, used 3104K [0x00000000fec00000, 0x00000000ffb00000, 0x00000000ffb00000)

  object space 15360K, 20% used [0x00000000fec00000,0x00000000fef08030,0x00000000ffb00000)

 PSPermGen       total 21504K, used 2520K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)

  object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c763c8,0x00000000faf00000)

 

年轻代4608K,from区被使用了98%,老年代15360k使用了3104k使用了20%,方法区使用了11%

 

永久代参数设置

-XX:PermSize  -XX:MaxPermSize

设置永久区的初始空间和最大空间

他们表示,一个系统可以容纳多少个类型

 

栈参数设置

-Xss

通常只有几百K

决定了函数调用的深度

每个线程都有独立的栈空间

局部变量、参数 分配在栈上

 

栈的大小与程序的调用深度相关的,并不是栈越大越好,如果太大每个线程分配的空间过大,一个系统能启动的线程就会变少

 

 

<think>好的,用户现在问的是关于JVM参数-XX:+HeapDumpOnOutOfMemoryError的详细介绍。首先,我需要回想一下这个参数的作用。记得这个参数是在JVM发生内存溢出(OOM)时自动生成堆转储文件,也就是Heap Dump。这样可以帮助开发人员分析内存泄漏或者内存使用过高的原因。 接下来,我需要考虑用户可能的背景。用户可能遇到了OOM的问题,或者正在学习如何调优JVM,想要了解如何配置以方便故障排查。他们可能是开发人员或者运维人员,需要处理生产环境中的内存问题。因此,回答需要既详细又实用,包括如何设置参数、生成的文件位置分析工具等。 然后,要确定用户可能没有明确提到的需求。比如,用户可能不仅想知道这个参数的作用,还想知道如何使用生成的Heap Dump文件,以及相关的其他参数,比如指定转储文件路径的-XX:HeapDumpPath。此外,可能还需要对比其他相关参数或方法,比如手动生成Heap Dump的方式,或者结合其他JVM参数进行内存分析。 我需要确保回答结构清晰,分点列出核心作用、使用方法、文件分析工具、注意事项等。同时,要给出实际的示例命令,方便用户直接复制使用。还要注意提醒用户生成Heap Dump可能带来的性能影响,尤其是在生产环境中需要权衡利弊。 另外,用户可能需要知道如何分析生成的Heap Dump文件,所以需要推荐一些常用工具,比如Eclipse MAT、VisualVM等,并简要说明使用方法。还要提到即使设置了参数,在某些情况下可能无法生成Heap Dump的情况,比如磁盘空间不足或权限问题,这样帮助用户避免常见陷阱。 最后,总结这个参数的重要性适用场景,强调它在故障排查中的价值,同时提醒配合其他JVM参数使用,比如-XX:HeapDumpPath-XX:OnOutOfMemoryError来执行自定义脚本,增强问题处理能力。</think>### JVM参数 `-XX:+HeapDumpOnOutOfMemoryError` 详解 --- #### **核心作用** 当JVM触发 **`OutOfMemoryError`(内存溢出)** 时,自动生成 **堆转储文件(Heap Dump)**,记录内存崩溃瞬间的堆内存快照。该文件是分析内存泄漏或内存消耗异常的 **关键证据**。 --- #### **参数用法** 1. **基本启用** 在JVM启动参数中添加: ```bash -XX:+HeapDumpOnOutOfMemoryError ``` 2. **指定转储路径**(配合 `-XX:HeapDumpPath`) ```bash -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/heapdump.hprof ``` - 路径可以是目录(自动生成文件名)或完整文件路径 - 示例文件名:`java_pid12345_20240320.hprof`(含进程ID时间戳) --- #### **典型应用场景** 1. **生产环境故障排查** 内存溢出时自动保留“案发现场”,避免重启后丢失关键信息。 2. **性能调优** 通过分析堆转储文件定位内存消耗过高的对象(如缓存未释放、大数组等)。 3. **偶发性问题捕捉** 捕获难以复现的间歇性内存泄漏问题。 --- #### **堆转储文件分析工具** | 工具名称 | 特点 | |------------------|----------------------------------------------------------------------| | **Eclipse MAT** | 内存分析神器,可视化对象依赖树,支持泄漏检测报告(需安装JDK) | | **VisualVM** | JDK自带工具,支持堆转储基础分析(命令行输入 `jvisualvm` 启动) | | **jhat** | 命令行工具,生成HTML报告(示例:`jhat heapdump.hprof`) | | **YourKit** | 商业工具,深度分析内存分配线程状态 | --- #### **实战配置示例** ```bash java -Xmx512m \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/var/log/myapp/oom_dumps \ -jar my-application.jar ``` - `-Xmx512m`:设置堆最大内存为512MB(更容易触发OOM测试) - 生成的转储文件会保存在 `/var/log/myapp/oom_dumps` 目录 --- #### **注意事项** 1. **磁盘空间** 堆转储文件大小通常与堆内存最大值相当(例如4GB的堆可能生成3GB的.hprof文件)。 2. **性能影响** 生成堆转储时JVM会暂停(STW),生产环境需评估对服务的影响。 3. **权限问题** 确保JVM进程对输出目录有写入权限,否则会静默失败。 4. **OOM类型** 仅对 `java.lang.OutOfMemoryError` 有效,其他错误(如栈溢出)不会触发转储。 --- #### **高级技巧** 1. **组合使用 `-XX:OnOutOfMemoryError`** 内存溢出时执行自定义脚本(如发送告警、重启服务): ```bash -XX:OnOutOfMemoryError="/opt/scripts/restart_service.sh" ``` 2. **压缩转储文件**(第三方工具) 使用 `gzip` 压缩节省空间(需手动处理): ```bash find /dump_dir -name "*.hprof" -exec gzip {} \; ``` 3. **自动化分析** 结合持续集成工具,自动解析堆转储并生成报告(需编写脚本)。 --- #### **手动生成堆转储** 即使未启用该参数,仍可通过以下方式获取堆转储: 1. **jmap命令** ```bash jmap -dump:format=b,file=heap.hprof <pid> ``` 2. **JVM信号触发** ```bash kill -3 <pid> # Linux/Mac ``` --- #### **关键总结** - **核心价值**:内存溢出时自动保留“内存快照”,极大提升问题诊断效率。 - **必配场景**:生产环境JVM强烈建议启用此参数- **分析要点**:重点关注重复创建的巨型对象、未释放的集合类(如HashMap、ArrayList)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值