Skip to content

Commit 7ed3f2c

Browse files
committed
daily update
1 parent 346b6cb commit 7ed3f2c

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

java/jvm/JAVA内存分析.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
一些可以用于分析jvm的工具
2+
* jconole: 大部分jdk自带
3+
* yourkit java profiler: 收费,界面现代一点,但是不能转换byte显示为mib感觉不太方便
4+
* eclipes memory analyzer(MAT):推荐,只能分析静态的head dump
5+
6+
---
7+
8+
java的内存抛开什么新生代老年代这种乱七八糟的来说,主要我们想知道我们哪里写的代码占了很多内存,应该怎么优化。
9+
10+
这里把java内存分为shalldow heap 和 retained heap,他们之间的区别是,
11+
12+
shalldow heap:一个对象直接占用内存,基本是对象包含的属性,例如一个int,一个byte,而对象是一个指针,通常是一个int,String在java中也是一个对象,无论多大的String,占用始终是一个int,这个肯定是不太符合场景的。
13+
14+
在jconsole jvisualvm 以及 idea的内存检测中都只能看到这种内存占用,通常占用的最大的就是byte[],因为String以及各种缓存都是String,还有map的key等等,这种通常看不出什么。
15+
16+
17+
所以我们需要知道一个对象占用的内存,也包括对象内的对象,也就是递归整个依赖树,也就是下面说的 retained heap;
18+
19+
retained heap 包含一个对象占用的所有内存,包含引用的对象内存,从gc root开始,以一个树行开始展开
20+
21+
像是mat这种工具就支持显示这种列表,yourkit也是可以。
22+
23+
---
24+
25+
26+
话又说回来,所谓heap dump也就只是heap区的内存,jvm还有很多non-heap的内存占用,这种一般也不方便调试,虽然加上参数`-XX:NativeMemoryTracking=summary`也可以打印一些信息。
27+
28+
29+
---
30+
31+
参考文档
32+
* https://spring-gcp.saturnism.me/deployment/docker/container-awareness
33+
* https://www.baeldung.com/jvm-code-cache
34+
* https://javadoop.com/post/metaspace
35+

0 commit comments

Comments
 (0)