- 浏览: 1899684 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
jquery打印指定的div -
GentlemanQc:
...
quartz系列(二)spring3.2.5与quartz2.1.7集群版集成简要说明 -
静夜独窗:
你好,能说一下server.xml增加的配置是怎么影响性能的吗 ...
tomcat7.0性能优化-挑战极限精简版 -
beyondfengyu:
beyondfengyu 写道如果每个客户进程的时间不同步,时 ...
java并发(二十二)分布式锁 -
beyondfengyu:
如果每个客户进程的时间不同步,时间超前的进程是不是更容易得到锁 ...
java并发(二十二)分布式锁
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
测试代码
控制台输出
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
转载请注明出处
-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
转载请注明出处
发表评论
-
java for 的几种用法
2014-12-02 09:59 1262J2SE 1.5提供了另一 ... -
finally不执行的陷阱
2014-05-16 09:23 1127写了个DEMO,说明下finally在System.exit( ... -
URI和URL的区别
2014-03-26 10:38 1298String HttpServletRequest.getRe ... -
Iterator与ListIterator区别
2014-03-23 22:21 1138Iterator:只能正向遍历集合,适用于获取移除元素。Lis ... -
快速失败特性
2014-03-23 22:20 1149从高级别层次来说快速失败是一个系统或软件对于其故障做出 ... -
java继承静态方法复写
2014-03-12 09:28 4422最近和人交流,遇到了这样一个问题,就是继承当中,静态方法复写的 ... -
关于return和finally
2014-03-11 10:19 2837本来return和finally也不是个事。之前看虚拟机运行原 ... -
JVM内存分析系列(十三)内存实践理解
2014-01-22 10:09 3121java堆 包括 新生代:eden,survival(from ... -
JVM内存分析系列(十二)G1垃圾收集器的使用
2014-01-16 17:10 11520Garbage First(G1)致力于在多CPU和大内存服务 ... -
JVM内存分析系列(十一)GC基本情况与CMS垃圾收集器调优
2014-01-16 11:44 11599初始标记 CMS-initial-mark 并发标记 CMS- ... -
eclipse内存优化
2014-02-26 14:00 1549修改eclipse的配置文件,添加或者修改参数如下,其中XX: ... -
远程调试(二)JVM
2014-01-10 11:43 1746从J2SE 1.4.2开始,就已经提出并实现了JavaTM P ... -
JVM内存分析系列(九)JDK监控和故障处理工具
2014-01-08 18:33 2074jps JVM Process Status Tool,显示指 ... -
guava--google----用来替代commons的jar包
2014-01-06 18:21 16833Guava 是一个 Google ... -
JVM内存分析系列(八)垃圾收集器介绍及性能指标
2013-12-30 13:33 2037内存回收的具体实现。 停顿时间越短就越适合需要 ... -
JVM内存分析系列(七)垃圾收集算法
2013-12-30 12:58 1120内存回收的方法论 标记-清除算法 Mark-Sweep 分为 ... -
JVM内存分析系列(六)对象存活判断
2013-12-26 11:10 1138对象存活常用2种算法 引用计数算法 给对象中添加一个 ... -
JVM内存分析系列(五)浅谈finalize()方法
2013-12-28 18:47 1470根搜索算法中不可达对象在回收之前,要进行二次标记。 第 ... -
JVM内存分析系列(四)对象4种引用
2013-12-25 20:07 1324强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象 ... -
JVM内存分析系列(三)JVM内存模型初步
2013-12-25 17:09 1163根据《Java虚拟机规范(第二版)》的规定,结构如下 1 ...
相关推荐
解决内存溢出的方法有两种:一是优化程序代码,减少全局变量的引用,让程序使用完变量的时候释放该引用,能够让垃圾回收器回收,释放资源;二是物理解决,增大物理内存,然后通过调整 JVM 的参数来调整内存的大小。 ...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...
【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...
HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能存在的内存泄漏或者过度占用内存的对象。通过分析heap dump文件,HeapAnalyzer可以展示对象的分布情况,识别...
简单的判断JVM内存溢出的方法
【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...
首先,ga456工具全称为"Garbage Collector and Memory Analyzer",它是一个强大的Java垃圾收集器和内存分析工具。该工具能够生成详细的内存快照,通过对比不同时间点的快照,可以发现哪些对象被持久保留,从而揭示...
### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。
当JVM遇到问题,如内存溢出或长时间的垃圾回收,它可能会生成堆栈转储(dump)文件,这些文件包含了JVM在特定时刻的详细状态,包括对象、类加载器、线程、堆和栈信息。"Jvm堆栈dump文件分析"是指通过特定工具对这些...
标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...
这款软件提供了丰富的功能,包括CPU使用率分析、内存分析、线程监控、类加载和方法调用统计等,是Java开发人员进行性能优化的重要辅助工具。 **1. 安装与使用** JProfiler的安装过程简单直接,下载解压后的文件...
了解并监控JVM的内存使用情况,对于预防和解决内存溢出错误至关重要。通过动态地调整`-Xms`和`-Xmx`参数,可以在运行时根据实际需求优化内存分配,从而提高程序的性能和稳定性。此外,定期检查和分析`heapSize`、`...
解决内存溢出问题通常需要调整JVM的内存参数,如`-Xms`和`-Xmx`用于设置堆的初始大小和最大大小,以及`-XX:MaxPermSize`(对于较旧的JVM版本)或`-XX:MaxMetaspaceSize`(对于Java 8及以上版本)来控制方法区的大小...
JVM内存模型是Java虚拟机(JVM)中的一种内存管理机制,它将内存区分为永久区内存(Permanent space)和堆内存(heap space)两大块。永久区内存用于存放加载的Class类级对象,如class本身、method、field等等,而堆...
Java虚拟机(JVM)内存结构与配置是Java开发者必须理解的重要概念,它涉及到程序的运行效率和稳定性。本文将详细解析JVM的内存结构、内存分配策略以及相关的配置参数。 1. **JVM内存结构** JVM内存主要分为以下几...
可以通过调整JVM参数`-Xms`和`-Xmx`来增加堆内存的初始值和最大值。例如,设置`-Xms2048m -Xmx2048m`可以将堆内存的最小和最大值都设置为2GB。 - **JVM默认堆内存配置**:JVM默认情况下,最小堆内存为物理内存的1...
关于 JVM 内存溢出的原因分析及解决方案探讨 本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决...
【JVM内存溢出】指的是Java...总的来说,解决JVM内存溢出问题需要深入了解Java内存模型,合理配置JVM参数,并结合性能监控工具进行诊断和优化。这不仅可以避免服务器因内存问题崩溃,还能提升整体系统的稳定性和性能。
9. 方法区大小:Java 8以后,需要关注-XX:MetaspaceSize和-XX:MaxMetaspaceSize参数,以防止元空间溢出。 10. 监控与诊断工具:如VisualVM、JConsole、JMX等可以帮助我们实时监控JVM状态,找出性能瓶颈。 总结,...
此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 #### 结语 合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理...