chenghanpeng / jdk11u Goto Github PK
View Code? Open in Web Editor NEW《新一代垃圾回收器ZGC设计与实现》一书参考的代码
License: GNU General Public License v2.0
《新一代垃圾回收器ZGC设计与实现》一书参考的代码
License: GNU General Public License v2.0
作者你好,我们有个java应用使用了zgc算法后,k8s监控看起来比较奇怪,wss将近是rss的3倍关系,有时应用还被k8s oomkiller的。rss = 725MB,wss=4.25GB
在看了你的书,内存管理一章后,猜测是multi-mapping导致的。
cat /sys/fs/cgroup/memory/memory.stat
cache 4056084480
rss 762945536
rss_huge 113246208
mapped_file 2646163456
swap 0
pgpgin 2913868
pgpgout 1764941
pgfault 3239721
pgmajfault 273
inactive_anon 2204684288
active_anon 1242574848
inactive_file 281550848
active_file 1090134016
unevictable 0
hierarchical_memory_limit 4831838208
hierarchical_memsw_limit 4831838208
total_cache 4056084480
total_rss 762945536
total_rss_huge 113246208
total_mapped_file 2646163456
total_swap 0
total_pgpgin 2913868
total_pgpgout 1764941
total_pgfault 3239721
total_pgmajfault 273
total_inactive_anon 2204684288
total_active_anon 1242574848
total_inactive_file 281550848
total_active_file 1090134016
total_unevictable 0
通过观察, wss 大概等于 total_cache + total_rss - total_inactive_file, 然后又通过smem查看内存映射情况
Note: linux里的RSS跟k8s的rss应该不一样
./smem -m
Map PIDs AVGPSS PSS
/pinpoint-agent/boot/pinpoint-annotation 1 0 0
/pinpoint-agent/boot/pinpoint-bootstrap- 1 0 0
/pinpoint-agent/boot/pinpoint-bootstrap- 1 0 0
/pinpoint-agent/boot/pinpoint-bootstrap- 1 0 0
/pinpoint-agent/pinpoint-bootstrap-1.8.5 1 0 0
/pinpoint-agent/plugin/pinpoint-jdk-http 1 0 0
[vdso] 6 0 0
[vsyscall] 6 0 0
/usr/lib/locale/C.UTF-8/LC_ADDRESS 4 1 4
/usr/lib/locale/C.UTF-8/LC_IDENTIFICATIO 4 1 4
/usr/lib/locale/C.UTF-8/LC_MEASUREMENT 4 1 4
/usr/lib/locale/C.UTF-8/LC_MESSAGES/SYS_ 4 1 4
/usr/lib/locale/C.UTF-8/LC_MONETARY 4 1 4
/usr/lib/locale/C.UTF-8/LC_NAME 4 1 4
/usr/lib/locale/C.UTF-8/LC_NUMERIC 4 1 4
/usr/lib/locale/C.UTF-8/LC_PAPER 4 1 4
/usr/lib/locale/C.UTF-8/LC_TELEPHONE 4 1 4
/usr/lib/locale/C.UTF-8/LC_TIME 4 1 4
/usr/local/openjdk-11/bin/java 1 8 8
/usr/lib/locale/C.UTF-8/LC_COLLATE 4 3 12
/usr/local/openjdk-11/lib/libextnet.so 1 12 12
/lib/x86_64-linux-gnu/libgcc_s.so.1 1 16 16
/lib/x86_64-linux-gnu/libutil-2.28.so 1 16 16
/pinpoint-agent/boot/pinpoint-commons-1. 1 16 16
/usr/lib/locale/C.UTF-8/LC_CTYPE 5 3 17
/usr/lib/x86_64-linux-gnu/gconv/gconv-mo 5 3 19
/lib/x86_64-linux-gnu/libbz2.so.1.0.4 1 20 20
/lib/x86_64-linux-gnu/libnss_dns-2.28.so 1 20 20
/usr/local/openjdk-11/lib/libmanagement. 1 20 20
/lib/x86_64-linux-gnu/librt-2.28.so 1 24 24
/usr/local/openjdk-11/lib/libjimage.so 1 24 24
/usr/local/openjdk-11/lib/libmanagement_ 1 24 24
/usr/local/openjdk-11/lib/libzip.so 1 28 28
/tmp/hsperfdata_root/8 1 32 32
/usr/lib/python2.7/lib-dynload/bz2.x86_6 1 36 36
/lib/x86_64-linux-gnu/libdl-2.28.so 5 8 40
/usr/local/openjdk-11/lib/libinstrument. 1 40 40
/pinpoint-agent/boot/pinpoint-bootstrap- 1 48 48
/tmp/libnetty_transport_native_epoll_x86 1 52 52
/lib/x86_64-linux-gnu/libresolv-2.28.so 1 56 56
/usr/local/openjdk-11/lib/jli/libjli.so 1 56 56
/usr/local/openjdk-11/lib/libsunec.so 1 56 56
/usr/local/openjdk-11/lib/libnio.so 1 60 60
/usr/local/openjdk-11/lib/libverify.so 1 60 60
/lib/x86_64-linux-gnu/libnss_files-2.28. 4 16 64
/bin/dash 1 80 80
/usr/lib/x86_64-linux-gnu/libstdc++.so.6 1 84 84
/usr/local/openjdk-11/lib/libnet.so 1 88 88
/lib/x86_64-linux-gnu/libz.so.1.2.11 2 46 92
/lib/x86_64-linux-gnu/libpthread-2.28.so 2 50 100
/usr/local/openjdk-11/lib/libjava.so 1 132 132
/lib/x86_64-linux-gnu/libm-2.28.so 2 74 148
/lib/x86_64-linux-gnu/ld-2.28.so 6 28 173
/lib/x86_64-linux-gnu/libtinfo.so.6.1 3 62 186
[stack] 6 86 520
/bin/bash 3 296 890
/lib/x86_64-linux-gnu/libc-2.28.so 6 155 934
/usr/bin/python2.7 1 1576 1576
/usr/local/openjdk-11/lib/modules 1 4008 4008
/usr/local/openjdk-11/lib/server/libjvm. 1 13584 13584
[heap] 6 4645 27872
<anonymous> 6 124326 745956
/memfd:java_heap 1 2554532 2554532
看到上面linux里的mapped_file跟/memfd:java_heap 占用比较接近,猜测是zgc的内存映射, 不清楚怎么验证。
114页,第7行,
中页面大小为32M,对象按照256KB对齐,所以最多可以存放128个对象
源码中注释,中页面对象是按**4K**对齐的
http://hg.openjdk.java.net/zgc/zgc/file/59c07aef65ac/src/hotspot/os_cpu/linux_x86/zGlobals_linux_x86.hpp#l34
第12页,页尾的一行,一个小笔误。
用NextBitmap表示整个内存从Bottom到Next指针之前的标记状态。
应该是
之间
的标记状态。
看了作者大大的书籍,首先收获良多,首先在这里表示感谢!
然后自己有一点思考,可能是我理解的有问题,怎么也想不通,希望能得到作者的解答,万分感谢!
无法联系到作者,于是通过提issue的方式问问题,在这里说声抱歉!
网上资料:
网上的资料都说是通过4位颜色指针判断是否是bad color的,意思是这4位颜色指针都是0的情况下就是good color,其余情况下是bad color
但是按照我的理解这4个颜色标志位不可能同时为0.
因为ZGC初始化之后,就会将全局视图设置为Remapped,后续的标记和转移,也会不停的在M视图和Remapped视图切换。
在Remapped视图创建对象,对象的地址视图就会被设置成Remapped
在M视图创建对象,对象的地址视图就会被设置成M
那么,哪来的0000呢?所以用判断对象的地址视图是不是0000来判断是不是good color行不通。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.