聊聊jvm的CompressedClassSpace
序
本文主要研究一下jvm的CompressedClassSpace
CompressedClassSpace
java8移除了permanent generation,然后class metadata存储在native memory中,其大小默认是不受限的,可以通过-XX:MaxMetaspaceSize来限制
如果开启了-XX:+UseCompressedOops及-XX:+UseCompressedClassesPointers(默认是开启),则UseCompressedOops会使用32-bit的offset来代表java object的引用,而UseCompressedClassPointers则使用32-bit的offset来代表64-bit进程中的class pointer;可以使用CompressedClassSpaceSize来设置这块的空间大小
如果开启了指针压缩,则CompressedClassSpace分配在MaxMetaspaceSize里头,即MaxMetaspaceSize=Compressed Class Space Size + Metaspace area (excluding the Compressed Class Space) Size
查看CompressedClassSpace大小
jcmd pid GC.heap_info
/ # jcmd 1 GC.heap_info
1:
Shenandoah Heap
524288K total, 144896K committed, 77232K used
2048 x 256K regions
Status: not cancelled
Reserved region:
- [0x00000000e0000000, 0x0000000100000000)
Metaspace used 45675K, capacity 46867K, committed 47104K, reserved 1091584K
class space used 5406K, capacity 5838K, committed 5888K, reserved 1048576K
可以看到整个metaspace使用了45675K,其中class space使用了5406K,而Metaspace area (excluding the Compressed Class Space)使用了45675K-5406K=40269K;整个metaspace的reserved大小为1091584K,其中class space的reserved大小为1048576K
jcmd pid VM.native_memory
/ # jcmd 1 VM.native_memory
1:
Native Memory Tracking:
Total: reserved=2224403KB, committed=238187KB
- Java Heap (reserved=524288KB, committed=144896KB)
(mmap: reserved=524288KB, committed=144896KB)
- Class (reserved=1092940KB, committed=48460KB)
(classes #8563)
( instance classes #7988, array classes #575)
(malloc=1356KB #20589)
(mmap: reserved=1091584KB, committed=47104KB)
( Metadata: )
( reserved=43008KB, committed=41216KB)
( used=40286KB)
( free=930KB)
( waste=0KB =0.00%)
( Class space:)
( reserved=1048576KB, committed=5888KB)
( used=5407KB)
( free=481KB)
( waste=0KB =0.00%)
- Thread (reserved=37130KB, committed=2846KB)
(thread #36)
(stack: reserved=36961KB, committed=2676KB)
(malloc=127KB #189)
(arena=42KB #70)
- Code (reserved=529360KB, committed=15420KB)
(malloc=968KB #4745)
(mmap: reserved=528392KB, committed=14452KB)
- GC (reserved=21844KB, committed=7724KB)
(malloc=5460KB #9644)
(mmap: reserved=16384KB, committed=2264KB)
- Compiler (reserved=165KB, committed=165KB)
(malloc=34KB #455)
(arena=131KB #5)
- Internal (reserved=3758KB, committed=3758KB)
(malloc=1710KB #6582)
(mmap: reserved=2048KB, committed=2048KB)
- Other (reserved=32KB, committed=32KB)
(malloc=32KB #3)
- Symbol (reserved=10277KB, committed=10277KB)
(malloc=7456KB #225421)
(arena=2821KB #1)
- Native Memory Tracking (reserved=4235KB, committed=4235KB)
(malloc=10KB #126)
(tracking overhead=4225KB)
- Arena Chunk (reserved=176KB, committed=176KB)
(malloc=176KB)
- Logging (reserved=7KB, committed=7KB)
(malloc=7KB #264)
- Arguments (reserved=18KB, committed=18KB)
(malloc=18KB #500)
- Module (reserved=165KB,www.yongshiyule178.com committed=165KB)
(malloc=165KB #1708)
- Safepoint (reserved=4KB, committed=4KB)
(mmap: reserved=4KB, committed=4KB)
- Unknown (reserved=4KB, www.baohuayule.com committed=4KB)
(mmap: reserved=4KB, committed=4KB)
可以看到class部分,reserved大小为1092940KB,其中Metadata的reserved大小为43008KB,Class space的reserved大小为1048576KB;其中Metadata使用了40286KB,而Class space使用了5407KB
jmx查看
@GetMapping("/meta")
public Object getMetaspaceSize(){
return ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class)
.stream()
.filter(e -> MemoryType.NON_HEAP == e.getType())
.filter(e -> e.getName().equals("Metaspace") || e.getName(www.gaozhuoyiqi.com).equals("Compressed Class Space"))
.map(e -> "name:"+e.getName()+",info:"+e.getUsage())
.collect(www.hengtongyoule.com Collectors.toList());
}
输出如下:
/ # curl -i localhost:8080/memory/meta
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 31 Mar 2019 03:06:55 GMT
["name:Metaspace,info:init = 0(0K) used = 46236784(45153K) committed = 47710208(46592K) max = -1(-1K)","name:Compressed Class Space,info:init = 0(0K) used = 5482736(5354K) committed www.qwert888.com/= 6029312(5888K) max = 1073741824(1048576K)"]
这里可以看到Metaspace总共使用了45153K,其中Compressed Class Space部分使用了5354K,而Metaspace area (excluding the Compressed Class Space)使用了45153K-5354K=39799K;而这里显示的Metaspace的max为-1,其中Compressed Class Space部分max值为1048576K即1G
spring boot应用查看
/ # curl -i "http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap"
HTTP/1.1 200
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
Transfer-Encoding:www.shengyunyule.cn chunked
Date: Sun, 31 Mar 2019 02:52:51 GMT
{"name":"jvm.memory.used","description":"The amount of used memory","baseUnit":"bytes","measurements":[{"statistic":"VALUE","value":6.4449464E7}],"availableTags":[{"tag":"id","values":["CodeHeap 'non-profiled nmethods'","CodeHeap 'profiled nmethods'","Compressed Class Space","Metaspace","CodeHeap 'non-nmethods'"]}]}
/ # curl -i "http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap&tag=id:Metaspace"
HTTP/1.1 200
Content-Disposition: inline;filename=www.gouyiflb.cn/ f.txt
Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 31 Mar 2019 02:54:56 GMT
{"name":"jvm.memory.used","description":"The amount of used memory","baseUnit":"bytes","measurements":[{"statistic":"VALUE","value":4.7468312E7}],"availableTags":[]}
/ # curl -i "http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap&tag=id:Compressed%
20Class%20Space"
HTTP/1.1 200
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot www.yun-shengyl.com.actuator.v2+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 31 Mar 2019 02:55:18 GMT
{"name":"jvm.memory.used","description":"The amount of used memory","baseUnit":"bytes","measurements":[{"statistic":"VALUE","value":5609952.0}],"availableTags":[]}
springboot使用micrometer,通过/actuator/metrics接口提供相关指标查询功能,其中Metaspace及Compressed Class Space在jvm.memory.used这个metric中 它是基于MemoryPoolMXBean来实现的,具体详见micrometer-core-1.1.3-sources.jar!/io/micrometer/core/instrument/binder/jvm/JvmMemoryMetrics.java
小结
java8移除了permanent generation,然后class metadata存储在native memory中,其大小默认是不受限的,可以通过-XX:MaxMetaspaceSize来限制;如果开启了-XX:+UseCompressedOops及-XX:+UseCompressedClassesPointers(默认是开启),则UseCompressedOops会使用32-bit的offset来代表java object的引用,而UseCompressedClassPointers则使用32-bit的offset来代表64-bit进程中的class pointer;可以使用CompressedClassSpaceSize来设置这块的空间大小
开启了指针压缩,则CompressedClassSpace分配在MaxMetaspaceSize里头,即MaxMetaspaceSize=Compressed Class Space Size + Metaspace area (excluding the Compressed Class Space) Size
查看CompressedClassSpace的内存使用情况有好几种方法:
jcmd pid GC.heap_info(Metaspace为总的部分,包含了class space,而Metaspace area (excluding the Compressed Class Space)需要自己计算即total-class space)
jcmd pid VM.native_memory(class为总的部分,包含了Metaspace area (excluding the Compressed Class Space)及Class Space)
使用JMX来获取NON_HEAP类型中的name为Metaspace及Compressed Class Space的MemoryPoolMXBean可以得到Metaspace及Compressed Class Space的使用情况(JMX得到的Metaspace为总的部分,而Metaspace area (www.lezongyule.com excluding the Compressed Class Space)需要自己计算即total-class space)
如果是springboot应用,它使用micrometer,通过/actuator/metrics接口提供相关指标查询功能,其中Metaspace及Compressed Class Space在jvm.memory.used这个metric中
doc
Class Metadata
7.19.3 -XX:CompressedClassSpaceSize
JDK 8: UseCompressedClassPointers vs. UseCompressedOops
JVM源码分析之Metaspace解密
聊聊jvm的PermGen与Metaspace
聊聊jvm的CompressedClassSpace的更多相关文章
- 聊聊JVM的年轻代(转)
聊聊JVM的年轻代 本文转自http://ifeve.com/jvm-yong-generation/ 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代 ...
- 推荐一下《聊聊JVM》的专栏
依照惯例新开了一个专栏后要单推一下.推荐一下<聊聊JVM的专栏>,网上关于JVM的文章太多,这个专栏希望能在已有的资料的基础上写出点新意,对一些重要的概念归纳总结,说说自己的观点.理解和实 ...
- 聊聊JVM的年轻代
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的 唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候 ...
- 【JVM】6、聊聊JVM常用参数设置
整体考虑堆大小 -Xms3550m, 初始化堆大小.通常情况和-Xmx大小设置一样,避免虚拟机频繁自动计算后调整堆大小. -Xmx3550m,最大堆大小. 考虑分代设置堆大小 首先通过jstat等工具 ...
- 聊聊jvm的PermGen与Metaspace
转载:https://segmentfault.com/a/1190000012577387 序 本文主要讲述一下jvm的PermGen与Metaspace java memory结构 分代概念 对于 ...
- 聊聊JVM(二)说说GC的一些常见概念
转自CSDN 上一篇总结GC的基础算法,各种GC收集器的基本原理,还是比较粗粒度的概念.这篇会整理一些GC的常见概念,理解了这些概念,相信对GC有更加深入的理解 1. 什么时候会触发Minor GC? ...
- 聊聊jvm系列
http://blog.csdn.net/column/details/talk-about-jvm.html
- 【Java】关于JVM运行时内存空间、JVM垃圾回收机制
参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...
- 阿里架构师带你深入浅出jvm
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...
随机推荐
- Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
- Git之项目使用
现在最为盛行的版本控制器,非git莫属了, 那就看看在项目中我们是如何使用它的吧 一. 在已经存在秘钥对的情况下,我们需要在本地进行相关配置 git config --global user.name ...
- Linux df 与du用法
df 查看一级目录的大小,但是不能查看文件的大小.du 可以查看目录或者文件大小. 1 df的基本用法 df命令可以显示目前所有文件系统的总空间及当前可用空间,用法如下: -a 全部文件系统列表-h ...
- 谷歌浏览器报错 Active resource loading counts reached to a per-frame
Active resource loading counts reached to a per-frame limit while the tab is in background. Network ...
- Day 5-8 自定义元类控制类的实例化行为
__call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...
- JDK 环境变量的设置、eclipse、Tomcat的配置
一.JDK的环境变量的设置 环境变量设置: JDK下载好后,(1)选择电脑属性-高级系统设置-高级-环境变量,接着在系统变量中(2)新建JAVA_HOME,变量值设置为下载好后JDK在电脑中的路径;( ...
- python之路--线程的其他方法
一 . current_thread的用法 import threading import time from threading import Thread, current_thread def ...
- 让PC端页面在手机端显示缩小版的解决方法
做页面的时候我们做好pC端页面时,因编辑那边需求,在手机端页面也应该是缩小版,不能乱的.在网上找了各种解决方案,经实验,这种是可以的: 在head里边加上这两句meta <meta name= ...
- postfix 邮箱设置及常见错误
postfix 邮箱设置及常见错误 1.如果装了sendmail的话,先卸载了. yum remove sendmail 2.安装 Postfix yum install postfix 3.更改默认 ...
- Windows 10 安装PHP Manager 失败的解决办法
首先安装.NET 2.0和.NET 3.5, 在 控制面板----程序----启用或关闭Windows功能 里面 然后修改注册表:HKLM/System/CCS/Services/W3SVC/P ...