`
85977328
  • 浏览: 1899684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM内存分析系列(一)JVM常用参数及溢出分析工具和方法

 
阅读更多
JDK1.6.45常用基本参数
-Djava.awt.headless=true #set to headless, just in case
-server 服务模式启动
-verbose:gc 开启gc日志打印
-Xms值} 最小堆
-Xmx{值} 最大堆
-Xss{值} 栈容量
-Xmn{值} 新生代的内存空间大小,注意:此处的大小是(eden + 2 survivor space)
-Xloggc 日志文件路径,例如-Xloggc:/var/logs/gc.log
-XX:+HeapDumpOnOutOfMemoryError 参数表示当JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof。
-XX:OnOutOfMemoryError=${脚本名字},在内存导出快照的时候,执行此脚本
-XX:PermSize={值} 方法区最小内存值
-XX:MaxPermSize={值} 方法区最大内存值
-XX:MaxDirectMemorySize={值}堆外内存
-XX:+DisableExplicitGC 禁用显示GC的System.gc()方法
-XX:+PrintGC
-XX:+PrintGCDetails 打印GC收集详情
-XX:+PrintGCTimeStamps

-XX:+PrintFlagsInitial 显示所有可设置参数及默认值
-XX:+PrintFlagsFinal

经验
新生代与老年代的默认比值是1:2,占用整个堆的大小。持久代则是另一块内存区域,需要单独设置。在新生代中,Eden与1个Survivor的比值是6:1,新生代:Survivor=8:1

测试内存溢出
启动配置(在eclipse中,则配置VM arguments)
其中需要注意,c:/tmp目录必须存在,否则文件名无法生成
-server -verbose:gc -Xms10m -Xmx10m -Xss128k -Xloggc:C:/tmp/gc.log -XX:PermSize=5m -XX:MaxPermSize=5m -XX:MaxDirectMemorySize=10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/tmp

测试代码
package com.chinaso.phl;

import java.util.ArrayList;
import java.util.List;

/**
 * @author piaohailin
 * @date 2013-12-24
 */
public class Server {

	/**
	 * @param args
	 * @author piaohailin
	 * @date 2013-12-24
	 */
	public static void main(String[] args) {
		List<Server> list = new ArrayList<Server>();
		while (true) {
			list.add(new Server());
		}
	}

}


控制台输出
java.lang.OutOfMemoryError: Java heap space
Dumping heap to C:/tmp\java_pid7636.hprof ...
Heap dump file created [17593217 bytes in 0.169 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.chinaso.phl.Server.main(Server.java:29)

异常到处文件在C:/tmp/java_pid7248.hprof
使用MemoryAnalyzer-1.3.0打开文件即可进行宕机分析
MemoryAnalyzer下载地址
http://www.eclipse.org/mat/downloads.php
用分析工具打开,如下

打开的首页


查看Dominator tree 可以看到创建最多的实例数



查看垃圾收集文件 C:/tmp/gc.log
0.128: [GC [PSYoungGen: 2624K->384K(3008K)] 2624K->1888K(9856K), 0.0067433 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
0.136: [GC [PSYoungGen: 3008K->384K(3008K)] 4512K->3936K(9856K), 0.0063252 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
0.144: [GC [PSYoungGen: 3008K->384K(3008K)] 6560K->6572K(9856K), 0.0081110 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
0.152: [Full GC [PSYoungGen: 384K->0K(3008K)] [PSOldGen: 6188K->5407K(6848K)] 6572K->5407K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0237171 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
0.177: [Full GC [PSYoungGen: 2624K->19K(3008K)] [PSOldGen: 5407K->6847K(6848K)] 8031K->6867K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0262551 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
0.205: [Full GC [PSYoungGen: 2045K->2045K(3008K)] [PSOldGen: 6847K->6847K(6848K)] 8893K->8893K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0273953 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
0.232: [Full GC [PSYoungGen: 2045K->2028K(3008K)] [PSOldGen: 6847K->6847K(6848K)] 8893K->8876K(9856K) [PSPermGen: 3036K->3029K(4096K)], 0.0342056 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
Heap
PSYoungGen      total 3008K, used 2117K [0x00000000ffcb0000, 0x0000000100000000, 0x0000000100000000)
  eden space 2624K, 80% used [0x00000000ffcb0000,0x00000000ffec16b8,0x00000000fff40000)
  from space 384K, 0% used [0x00000000fff40000,0x00000000fff40000,0x00000000fffa0000)
  to   space 384K, 0% used [0x00000000fffa0000,0x00000000fffa0000,0x0000000100000000)
PSOldGen        total 6848K, used 6847K [0x00000000ff600000, 0x00000000ffcb0000, 0x00000000ffcb0000)
  object space 6848K, 99% used [0x00000000ff600000,0x00000000ffcafff8,0x00000000ffcb0000)
PSPermGen       total 4096K, used 3038K [0x00000000ff200000, 0x00000000ff600000, 0x00000000ff600000)
  object space 4096K, 74% used [0x00000000ff200000,0x00000000ff4f7bf8,0x00000000ff600000)


附录
本文只是模拟各种内存溢出的情况,文章追求精简直接,本文不适合初学者,需要有一定的基础,对JVM内存模型有一定的了解。




作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:6301655@163.com

转载请注明出处
  • 大小: 167.7 KB
  • 大小: 271.1 KB
分享到:
评论

相关推荐

    JVM内存溢出问题解析

    解决内存溢出的方法有两种:一是优化程序代码,减少全局变量的引用,让程序使用完变量的时候释放该引用,能够让垃圾回收器回收,释放资源;二是物理解决,增大物理内存,然后通过调整 JVM 的参数来调整内存的大小。 ...

    jvm内存分析工具mat安装包

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...

    jvm 内存分析文档

    【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...

    java 内存溢出分析工具 HeapAnalyzer

    HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能存在的内存泄漏或者过度占用内存的对象。通过分析heap dump文件,HeapAnalyzer可以展示对象的分布情况,识别...

    JVM原理及内存溢出经典案列分析.ppt

    简单的判断JVM内存溢出的方法

    ha456.jar(IBMHeapAnalyzer)JVM内存分析工具

    【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...

    JVM内存分析工具.7z

    首先,ga456工具全称为"Garbage Collector and Memory Analyzer",它是一个强大的Java垃圾收集器和内存分析工具。该工具能够生成详细的内存快照,通过对比不同时间点的快照,可以发现哪些对象被持久保留,从而揭示...

    jvm内存溢出

    ### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。

    Jvm堆栈dump文件分析

    当JVM遇到问题,如内存溢出或长时间的垃圾回收,它可能会生成堆栈转储(dump)文件,这些文件包含了JVM在特定时刻的详细状态,包括对象、类加载器、线程、堆和栈信息。"Jvm堆栈dump文件分析"是指通过特定工具对这些...

    某应用内存溢出(暨jvm)分析分享

    标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...

    jvm分析工具JProfiler,java应用内存溢出堆栈快照分析工具

    这款软件提供了丰富的功能,包括CPU使用率分析、内存分析、线程监控、类加载和方法调用统计等,是Java开发人员进行性能优化的重要辅助工具。 **1. 安装与使用** JProfiler的安装过程简单直接,下载解压后的文件...

    java获得jvm内存大小

    了解并监控JVM的内存使用情况,对于预防和解决内存溢出错误至关重要。通过动态地调整`-Xms`和`-Xmx`参数,可以在运行时根据实际需求优化内存分配,从而提高程序的性能和稳定性。此外,定期检查和分析`heapSize`、`...

    java内存泄露、溢出检查方法和工具

    解决内存溢出问题通常需要调整JVM的内存参数,如`-Xms`和`-Xmx`用于设置堆的初始大小和最大大小,以及`-XX:MaxPermSize`(对于较旧的JVM版本)或`-XX:MaxMetaspaceSize`(对于Java 8及以上版本)来控制方法区的大小...

    JVM内存模型

    JVM内存模型是Java虚拟机(JVM)中的一种内存管理机制,它将内存区分为永久区内存(Permanent space)和堆内存(heap space)两大块。永久区内存用于存放加载的Class类级对象,如class本身、method、field等等,而堆...

    JVM 内存结构及配置总结

    Java虚拟机(JVM)内存结构与配置是Java开发者必须理解的重要概念,它涉及到程序的运行效率和稳定性。本文将详细解析JVM的内存结构、内存分配策略以及相关的配置参数。 1. **JVM内存结构** JVM内存主要分为以下几...

    JVM内存配置优化

    可以通过调整JVM参数`-Xms`和`-Xmx`来增加堆内存的初始值和最大值。例如,设置`-Xms2048m -Xmx2048m`可以将堆内存的最小和最大值都设置为2GB。 - **JVM默认堆内存配置**:JVM默认情况下,最小堆内存为物理内存的1...

    关于JVM内存溢出的原因分析及解决方案探讨.docx

    关于 JVM 内存溢出的原因分析及解决方案探讨 本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决...

    JVM内存溢出

    【JVM内存溢出】指的是Java...总的来说,解决JVM内存溢出问题需要深入了解Java内存模型,合理配置JVM参数,并结合性能监控工具进行诊断和优化。这不仅可以避免服务器因内存问题崩溃,还能提升整体系统的稳定性和性能。

    java -jvm 内存分配和jvm调优

    9. 方法区大小:Java 8以后,需要关注-XX:MetaspaceSize和-XX:MaxMetaspaceSize参数,以防止元空间溢出。 10. 监控与诊断工具:如VisualVM、JConsole、JMX等可以帮助我们实时监控JVM状态,找出性能瓶颈。 总结,...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 #### 结语 合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理...

Global site tag (gtag.js) - Google Analytics