/**
* 测试
* @author regotto
*/
public class JvmTest {
public static void main(String[] args) {
//获取系统参数
String str = System.getProperty("str");
System.out.println(str);
}
}
在IDEA的运行配置环境中添加VM options
运行结果: hello
server: 初始堆空间大, 并行垃圾回收, 启动慢, 运行快
client: 初始堆空间小, 串行垃圾回收, 启动快, 运行慢
默认64操作系统只有server类型
boolean类型:
-XX:[+-] +表示启用属性, -表示禁用属性
例: -XX:+DisableExplicitGC 禁止手动调用GC
非boolean类型:
-XX:= 设置name值为value
例: -XX:NewRatio=1 设置新老代比值
Young: 年轻代=> 包含Eden, 2*Survivor, 其中一个Survivor用于存放GC时存活的对象, 经历几次垃圾回收, Survivor中存活对象转移到Tenured
Tenured: 老年代存放生命周期长的对象, 对象在Young中区域中, 经历多次GC都还存活, 才能转移到Tenured, 当生产一个大对象时, 会直接移动到老年代中
Perm: 1.7版本, 保存class, method, field对象. 很少出现OOM
MetaspaceVM: 1.8版本, 使用元数据空间替换Perm区, 存放位置放置在直接内存中, 不再占用虚拟机空间
Virtual: 最大内存与初始内存的差值
根据官方说明: 融合HotSpot, JRockit(不存在永久代), 且永久代容易出现OOM
Loaded: 加载class数量 Bytes: 占用空间大小 Unloaded: 未加载数量 Bytes: 未加载空间 Time: 时间
Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法
查看当前应用GC情况
S0C:第一个Survivor区的大小(KB) S1C:第二个Survivor区的大小(KB) S0U:第一个Survivor区的使用大小(KB) S1U:第二个Survivor区的使用大小(KB)
EC:Eden区的大小(KB) EU:Eden区的使用大小(KB) OC:Old区大小(KB) OU:Old使用大小(KB)
MC:方法区大小(KB) MU:方法区使用大小(KB) CCSC:压缩类空间大小(KB) CCSU:压缩类空间使用大小(KB)
YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
动态查看应用运行情况: jstat -gc 13880 1000 5 => 每隔1s打印一次, 总共打印5次
jmap: 相比于jstat, jmap能获取更加详细的内容
查看当前应用堆情况:
查看应用存活对象:
jmap -histo 105772 代表查看所有对象, 包括死亡的对象
对象说明:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[] [L+类名 其他对象
jmap -dump:format=b, file=dumpFileName 应用端口
jhat -port 端口 dump文件
可以对上面的内容进行检查, 快速定位分析问题, 哪个地方有大对象产生, 那个地方的内存分配不合理等情况
import java.util.ArrayList;
import java.util.UUID;
/**
* 内存溢出测试
* @author regotto
*/
public class JvmTestOutOfMemarry {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<String>();
for (int i = 0; i < 10000000; i++) {
String s = "";
for (int j = 0; j < 10000; j++) {
s += UUID.randomUUID().toString();
}
strings.add(s);
}
System.out.println("Ok");
}
}
-XX:HeapDumpOnOutOfMemoryError: 设置程序内存溢出时, 自动生成dump文件
将在项目下生成的java_pid175420.hprof导入Eclipse Memory Analyzer工具
查看分析报告: 在main函数中, 存在本地变量占用73.09%的内存空间, 点击see stacktrace查看线程栈调用情况, 如下图, 可以看出StringBuilder.append导致内存溢出情况
使用方式 => 自行百度
注: 监控远程服务器上的程序, 需要配置JMX才能进行JMX连接