- 浏览: 1873973 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1229J2SE 1.5提供了另一 ... -
finally不执行的陷阱
2014-05-16 09:23 1072写了个DEMO,说明下finally在System.exit( ... -
URI和URL的区别
2014-03-26 10:38 1258String HttpServletRequest.getRe ... -
Iterator与ListIterator区别
2014-03-23 22:21 1097Iterator:只能正向遍历集合,适用于获取移除元素。Lis ... -
快速失败特性
2014-03-23 22:20 1087从高级别层次来说快速失败是一个系统或软件对于其故障做出 ... -
java继承静态方法复写
2014-03-12 09:28 4380最近和人交流,遇到了这样一个问题,就是继承当中,静态方法复写的 ... -
关于return和finally
2014-03-11 10:19 2803本来return和finally也不是个事。之前看虚拟机运行原 ... -
JVM内存分析系列(十三)内存实践理解
2014-01-22 10:09 3095java堆 包括 新生代:eden,survival(from ... -
JVM内存分析系列(十二)G1垃圾收集器的使用
2014-01-16 17:10 11479Garbage First(G1)致力于在多CPU和大内存服务 ... -
JVM内存分析系列(十一)GC基本情况与CMS垃圾收集器调优
2014-01-16 11:44 11535初始标记 CMS-initial-mark 并发标记 CMS- ... -
eclipse内存优化
2014-02-26 14:00 1469修改eclipse的配置文件,添加或者修改参数如下,其中XX: ... -
远程调试(二)JVM
2014-01-10 11:43 1713从J2SE 1.4.2开始,就已经提出并实现了JavaTM P ... -
JVM内存分析系列(九)JDK监控和故障处理工具
2014-01-08 18:33 1996jps JVM Process Status Tool,显示指 ... -
guava--google----用来替代commons的jar包
2014-01-06 18:21 16759Guava 是一个 Google ... -
JVM内存分析系列(八)垃圾收集器介绍及性能指标
2013-12-30 13:33 2002内存回收的具体实现。 停顿时间越短就越适合需要 ... -
JVM内存分析系列(七)垃圾收集算法
2013-12-30 12:58 1087内存回收的方法论 标记-清除算法 Mark-Sweep 分为 ... -
JVM内存分析系列(六)对象存活判断
2013-12-26 11:10 1103对象存活常用2种算法 引用计数算法 给对象中添加一个 ... -
JVM内存分析系列(五)浅谈finalize()方法
2013-12-28 18:47 1432根搜索算法中不可达对象在回收之前,要进行二次标记。 第 ... -
JVM内存分析系列(四)对象4种引用
2013-12-25 20:07 1290强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象 ... -
JVM内存分析系列(三)JVM内存模型初步
2013-12-25 17:09 1136根据《Java虚拟机规范(第二版)》的规定,结构如下 1 ...
相关推荐
JVM内存dump分析工具MAT独立安装包,分析内存溢出利器,可以准确定位内存异常原因,解决问题,MemoryAnalyzer-1.10.0.20200225.zip
程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了, 内存溢出的问题要看业务和系统大小而定,对于某些系统可能内存溢出不常见,但某些系统还是很常见的解决的方法
简单的判断JVM内存溢出的方法
jvm内存溢出 学习笔记
JVM内存溢出的解决方案以及相关描述和TOMACAT参数配置
tomcat修改JVM内存配置(解决大项目内存溢出问题有效方案)
对tomcat jvm内存进行修改,以避免tomcat内存溢出。
关于JVM内存溢出的原因分析及解决方案探讨.docx
而阻碍系统性能提高的第一大元凶就是内存问题,更糟糕的是如果GC不能完全释放无用的内存,这会导致内存溢出,从而产生更严重的后果。 找出内存问题的元凶是一件非常困难的任务,幸运的是,heapaudit可以解决这个问题...
深入理解JVM内存区域与内存溢出异常
JVM原理及内存溢出案列分析PPT教案学习.pptx
一、Jdk组成 二、Jdk32与jdk64的差异 三、自动内存管理机制 四、内存泄露与内存溢出 五、垃圾回收算法 六、虚拟机性能监控工具
本作者项目原创经历,内容关于java的一个web项目内存溢出的分析和解决,其中详细介绍了诊断的方法和一些工具的使用,重点写了利用Eclipse Memory Analyzer 分析工具来分析jvm的堆快照。很有实用价值。
jvm堆内存溢出jar包代码
主要是针对JVM内存溢出,服务器宕机,内存优化,溢出类型进行介绍
2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...
JVM实战-对象访问与内存溢出异常解析
MyEclipse开发工具中如何配置jvm虚拟机内存,防止开发过程中内存溢出
2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...
详细讲述了JVM参数的调优方法和步骤.并描述了GC垃圾回收机制的瓶颈,以及出现内存溢出的原因。