pmap -x $(pidof java|head -n 1) |awk '{print ($3, $0)}' |grep anon |sort -nr |grep -v '^0' |head
直接内存追踪:
-XX:NativeMemoryTracking=[off | summary | detail]
jcmd $(pidof java) VM.native_memory summary scale=MB >native_memory$(date -Is).txt
可用jcmd关闭 jcmd $(pidof java) VM.native_memory shutdown(不能动态打开)
jvm主要内存占用
heap Xmx
g1 gc极端可能占用20%内存, 观察到 24g heap占用1g堆外
meta 100多
线程 每个线程1MB stack
direct buffer(internal?) 可jmx看,网络应用可能有几百MB
code(JIT) 100来MB
glibc的malloc如果最后申请的少量内存没有释放,可能影响之前free的内存归还操作系统
glibc内存分析.pdf(glibc内存管理ptmalloc源代码分析)
https://www.alibabacloud.com/blog/a-detailed-explanation-of-jvm-garbage-collector-g1%26zgc_601536
https://www.cnblogs.com/z00377750/p/14470883.html
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html
#有bug? 使用 https://stackoverflow.com/questions/21483984/python-read-linux-memory-process-error-proc-pid-mem?
ps -ef |grep $1
echo pid is $1
echo continue?
read
line=$(pmap -x $1 | grep $2)
echo matched line is $line
read a b <<< $(echo $line| awk '{print $1, $2}' )
#offet size in hex
echo $a $b
pgsize=$( getconf PAGESIZE )
bcount=$(( $b * 1024 ))
echo $a $b $pgsize enter to continue
read
dd if=/proc/$1/mem bs=$pgsize iflag=skip_bytes,count_bytes skip=$(( 0x$a )) count=$bcount of="$1_mem_$a.bin"