JVM区域细颗粒度划分
《深入jvm虚拟机》一书中对jvm内存区域分为,堆,元空间,栈,直接内存,程序计数器。
而事实上,jvm空间中的划分远远比这个要细。大致如下图。
所以Java进程占用的最大内存为:
old+eden+survivor_from+survivor_to+string_constant_pool+code_cache+metaspace+thread_stack+direct+mapped+jvm+native_memory
各个区域的含义及作用
堆内存大家都很熟悉了,无非是,新生代,老年代,字符串常量池.
重点说一下堆外内存:
一.code cache
代码缓存区域,用于jvm 将java代码编译成本地代码所存放的区域。主要用于JIT(即时编译器)编译的本地代码的存放。
可以使用:
1.–XX:+ PrintCodeCache JVM 来查看占用详情
2.使用UseCodeCacheFlushing=true来控制该区域的刷新
3.使用ReservedCodeCacheSize 来控制该区域的大小,默认为48M
二.compressd class space
打开UseCompressedClassPointer 选项后,class中的指针也用32位版本,而这些指针指向的空间就是compressd class space。
主要为了解决在64位虚拟机下指针空间浪费造成cpu 处理减少的问题,故压缩指针为32位的指针。
可以使用:1.-XX:+UseCompressedOops 启用压缩的对象指针。
2.XX:+UseCompressedClassPointers 启用压缩的类指针。
两者默认都处于打开状态,但可以手动关闭。
如果关闭压缩类指针,则将没有压缩类空间,并且该-XX:CompressedClassSpaceSize开关将被忽略。
默认大小是1G,但可以通过“CompressedClassSpaceSize”调整。如果引用太多包,可能会导致:java.lang.OutOfMemoryError: Compressed class space
调大-XX:CompressedClassSpaceSize即可。
查看jvm各部分内存
使用命令行选项启动JVM :-XX:NativeMemoryTracking=summary
jcmd VM.native_memory summary
可以查看得到信息如下:
Native Memory Tracking:
Total: reserved=2527378KB, committed=1253966KB
- Java Heap (reserved=1048576KB, committed=1048576KB)
(mmap: reserved=1048576KB, committed=1048576KB)
- Class (reserved=1109934KB, committed=69806KB)
(classes #13386)
(malloc=1966KB #17931)
(mmap: reserved=1107968KB, committed=67840KB)
- Thread (reserved=38152KB, committed=38152KB)
(thread #38)
(stack: reserved=37988KB, committed=37988KB)
(malloc=120KB #189)
(arena=43KB #72)
- Code (reserved=253208KB, committed=19924KB)
(malloc=3608KB #6317)
(mmap: reserved=249600KB, committed=16316KB)
- GC (reserved=6279KB, committed=6279KB)
(malloc=2343KB #270)
(mmap: reserved=3936KB, committed=3936KB)
- Compiler (reserved=166KB, committed=166KB)
(malloc=35KB #663)
(arena=131KB #5)
- Internal (reserved=2529KB, committed=2529KB)
(malloc=2497KB #17700)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=16920KB, committed=16920KB)
(malloc=14387KB #139329)
(arena=2533KB #1)
- Native Memory Tracking (reserved=2864KB, committed=2864KB)
(malloc=9KB #110)
(tracking overhead=2855KB)
- Arena Chunk (reserved=690KB, committed=690KB)
(malloc=690KB)
- Unknown (reserved=48060KB, committed=48060KB)
(mmap: reserved=48060KB, committed=48060KB)
未完待续