本篇内容主要讲解“JVM内存优化怎么做”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JVM内存优化怎么做”吧!
在Eclipse上安装MAT(MemoryAnalyzer Tool)插件,官网链接(https://wiki.eclipse.org/MemoryAnalyzer)
步骤如下:
点击Help,Install New Soft,就出现了以下Install界面:然后我们点击ADD,在弹出的框中填上Mat插件的地址:http://download.eclipse.org/mat/1.8/update-site/,确定后,
点击Select All,点击Next,之后就一直确定,就能安装了。安装之后需要重启Eclipse.
分析命令
// -Xms8m -Xmx8m -XX:+PrintGCDetails
// 打印垃圾回收信息
//-Xms8m -Xmx32m -XX:+HeapDumpOnOutOfMemoryError
//生成内存快照文件 查看错误信息
package com.shi.jvm;
import java.util.ArrayList;
import java.util.List;
/**
* Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
* @author shiye
*
GC跟踪: -verbose:gc
-XX:+PrintGCDetails
打印GC详细信息
-XX:+PrintGCTimeStamps
打印CG发生的时间戳
-Xloggc:log/gc.log
指定GC log的位置,以文件输出
帮助开发人员分析问题
堆:
-XX:+PrintHeapAtGC
每次一次GC后,都打印堆信息
-XX:+TraceClassLoading
监控类的加载
-XX:+PrintClassHistogram
按下Ctrl+Break后,打印类的信息:
-Xmx –Xms
指定最大堆和最小堆
-Xmx20m -Xms5m
-Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比
Survivor :eden=2:8,即一个Survivor占年轻代的1/10
-Xmx20m -Xms20m -Xmn1m -XX:+PrintGCDetails
结果:
Exception in thread "main" [Full GC (Ergonomics) java.lang.OutOfMemoryError: GC overhead limit exceeded
[PSYoungGen: 512K->0K(1024K)] [ParOldGen: 18595K->517K(18944K)] 19107K->517K(19968K), [Metaspace: 2625K->2625K(1056768K)], 0.0077164 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
at java.lang.Integer.toString(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at com.shi.jvm.OOMTest.main(OOMTest.java:58)
-XX:+HeapDumpOnOutOfMemoryError
OOM时导出堆到文件
-XX:+HeapDumpPath
导出OOM的路径
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
XX:OnOutOfMemoryError
在OOM时,执行一个脚本
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“
当程序OOM时,在D:/a.txt中将会生成线程的dump
可以在OOM时,发送邮件,甚至是重启程序
总结:根据实际事情调整新生代和幸存代的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
在OOM时,记得Dump出堆,确保可以排查现场问题
栈:
-XX:PermSize -XX:MaxPermSize
设置永久区的初始空间和最大空间
他们表示,一个系统可以容纳多少个类型
-Xss
通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数 分配在栈上
*
*/
public class OOMTest {
public static void main(String[] args) {
List<String> list = new ArrayList();
int i = 0;
while(true) {
//public native String intern();
list.add(String.valueOf(i++).intern());
}
}
}























到此,相信大家对“JVM内存优化怎么做”有了更深的了解,不妨来实际操作一番吧!这里是天达云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!