如何查看大对象
jps:查看Java的进程列表
jmap -histo:live 34854 | head -n 10
class name表示:
[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]
String[] Str1 = new String[10];
String[] str1 = {"abc","def"};
System.out.println(Str1);
[Ljava.lang.String;@f0c85e
"[" 表示一维数组
"[["表示二维数组
"L"表示一个对象
"java.lang.String"表示对象的类型
"@"后面表示该对象的HashCode
分代的相关知识
堆(Heap):
-新生代:eden区;From survivor;To Survivor 默认比例:8:1:1
-老年代:
方法区(Method Area),也叫非堆(Non-Heap):
-永久代(也叫持久代):
元空间(Metaspace):
在jdk 7之后,原先位于方法区里的字符串常量池已被移动到了java堆中。并且在jdk8以后,使用原空间替代了永久代。
常用的参数设置
GC日志打印
-XX:+PrintGC -XX:+PrintGCDetails -Xloggc:gc.log
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
工具使用:
执行命令,dump出线程状态保存到本地文件,然后再上传分析:jstack -l pid > test.txt
参考文献:
Metaspace 之一:Metaspace整体介绍(永久代被替换原因、元空间特点、元空间内存查看分析方法)
Java8内存模型—永久代(PermGen)和元空间(Metaspace)