NativeMemoryTracking的再学习
摘要
最近一段时间学习jvm比较多.
为了能够更加深入的进行一些调优和峰值性能的配置.
看了很多像是NMT,inline,堆区方法区以及分层编译等知识.
但是看到华为毕昇社区说的codecache相关部分.感觉挺值得学习的
前几天也学习总结了下NMT的知识. 但是感觉可能不是非常系统,这次就继续学习一下.
可能仅是流水账. 希望能够对日后的工作有所帮助. 可能会有很多期
站在高手的肩膀上
毕昇JDK社区有一个帖子专门讲解了 codecache 的配置和aarch64架构下的问题来源.
我这边简单总结一下:
因为aarch64是risc精简指令集, 为了达到x86 这样risc复杂指令集能够实现的功能.
他需要有更多的指令数来完成对应的方法操作.
这也就导致了,同样的一段代码, 在进行jit时. x86编译后的可执行文件的大小(占内存)
会小于aarch64编译后的文件大小.
但是jdk8时 启动程序后的codecache可能是相仿的,就会导致x86能够容纳的jit编译后的方法数量
要大于aarch64的
当codecache满了之后, jvm执行代码会劣化到使用 int 解释进行执行
会导致严重的性能衰退.
基于此需要进行code cache的相关优化操作.
一些自己的理解扩展
衡量一个CPU性能的好坏, 主频仅仅是一个方面
一般理解相似架构的情况下,主频越高性能越好.
不同架构下面, 同频性能就是一个很值得评判CPU厂商能力的指标.
这里很不幸的是, 国内大部分信创CPU厂商都盲目追求 主频的升高.
但是对IPC的提升都比较有限(龙芯因为制程上不去,所以一直说自己IPC有提高)
复杂指令集虽然也可能最后编译成uos 的方式进行执行.
但是一个指令周期内. CISC理论上会比RISC要多干一些事情, 因为可能执行更复杂的指令
aarch64就存在这样的一个问题. 本身完成相同function 就要比 x86 多很多处理器指令.
相同周期内执行的指令可能还不如x86执行的多
所以性能上 aarch64的同频率性能可能只有x86的一半
当然了此处苹果的M系列,因为及其牛B的设计, 尤其是on package的统一内存
并且苹果自研增加的很多缓存,指令优化,以及台积电最好的生产制程导致M1和M2的性能极高.
可以与x86一决高下
但是国内的CPU厂商一方面没有苹果的技术积累. 另一方面没有台积电的制程加成
所以性能要比m系列差不只一倍.
国产当自强
进行NMT简单分析
启动脚本里面增加上一段设置
-XX:NativeMemoryTracking=detail
然后启动服务的过程中编写一段非常简单的循环处理
for i in {1..20000} ; do jcmd 4002199 VM.native_memory > ${i}.txt;echo $i ;sleep 30 ; done
需要注意 为了简单(今天跳绳有点累和困), 我直接获取了启动成功后的线程进行展示.
然后可以查看启动过程中code Codecache的变化
grep -ir code -A 2
可以查看 code 以及后面两行的内容
我分析了aarch64 还有 x86_64的
这里我产生了一个极大的疑问
aarch64的codeCache默认值跟x86_64 不一样,而且反而更小
aarch64
1.txt:- Code (reserved=137027KB, committed=28035KB)
1.txt- (malloc=3907KB #5977)
1.txt- (mmap: reserved=133120KB, committed=24128KB)
172.txt:- Code (reserved=153096KB, committed=121736KB)
172.txt- (malloc=19976KB #26142)
172.txt- (mmap: reserved=133120KB, committed=101760KB)
因为30秒获取一次, 所以 前面几次只有 28M左右的codecache的占用. 但是启动成功后占用了120M左右.
堆区的reserved的内存大小一开始是 128MB. 慢慢增加到了 153MB
感觉跟书本上的不太一致.
对应的x86的统计情况
1.txt:- Code (reserved=260409KB, committed=69505KB)
1.txt- (malloc=10809KB #13261)
1.txt- (mmap: reserved=249600KB, committed=58696KB)
21.txt:- Code (reserved=275395KB, committed=153195KB)
21.txt- (malloc=25795KB #33803)
21.txt- (mmap: reserved=249600KB, committed=127400KB)
发现堆区CodeCache都进行了一定程度的增长
另外统计发现:
启动成功使用了150M的堆区
打开一个功能有可能会增加4M的堆区使用.
所以感觉如果是很多功能的场景需要增加codeCache的大小
简单理解
1. 因为进行C1和C2编译需要有执行调用和回边的次数阙值. 所以产品运行过程中的CodeCache会逐渐增加.
2. 单一模块和全部模块的使用场景也是不一样的. 单一模块可能CodeCache不会要求太多台复杂
但是如果是全模块使用, 可能需要提高CodeCache 避免堆区被占用殆尽.
3. 没有找到扩大CodeCache可能产生负面效果的文档. 感觉在内存没有瓶颈的情况下应该适当增加这个数值
避免因为CodeCache耗尽,JVM不进行jit编译导致性能劣化.
NativeMemoryTracking的再学习的更多相关文章
- js再学习笔记
#js再学习笔记 ##基本 1.js严格区分大小写 2.js末尾的分号可加,也可不加 3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...
- express再学习
对比spring,django,再学习express就有很多共通的地方啦... 看的书是一本小书,<express in action>,排版比较好. 昨天开始看,看了快四分之一啦... ...
- Android再学习-20141023-Intent-Thread
20141023-Android再学习 Intent对象的基本概念 Intent是Android应用程序组件之一 Intent对象在Android系统中表示一种意图 Intent当中最重要的内容是ac ...
- Android再学习-20141022-Activity的生命周期
20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...
- Android再学习-20141018-布局-进度条
20141018-Android再学习 对齐至控件的基准线 为了保证印刷字母的整齐而划定的线(四线三格的第三条线). android:layout_alignBaseline 与父控件的四个边缘对齐( ...
- 再学习sqlhelper
在机房收费重构系统的时候,第一次学习sqlhelper.当时感觉比较简单,没有写博客总结,现在又经过了图书馆的学习,感觉还是有必要写一写的. SqlHelper是一个基于.NETFramework的数 ...
- c/c++再学习:常用字符串转数字操作
c/c++再学习:常用字符串转数字操作 能实现字符串转数字有三种方法,atof函数,sscanf函数和stringstream类. 具体demo代码和运行结果 #include "stdio ...
- c/c++再学习:C与Python相互调用
c/c++再学习:Python调用C函数 Python 调用C函数比较简单 这里两个例子,一个是直接调用参数,另一个是调用结构体 C代码 typedef struct { int i1; int i2 ...
- MQTT再学习 -- MQTT 客户端源码分析
MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...
- Applet再学习
ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...
随机推荐
- 解读 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis) 的迁移
摘要:本期将详细介绍 SSDB.LevelDB 和 RocksDB 到 GaussDB(for Redis)的迁移. 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis) ...
- 一文带你认识AscendCL
摘要:AscendCL(Ascend Computing Language,昇腾计算语言)是昇腾计算开放编程框架,是对底层昇腾计算服务接口的封装. 本文分享自华为云社区<[CANN文档速递09期 ...
- 知道ThreadLocal吗?一起聊聊到底有啥用
摘要:ThreadLocal是 java 提供的一个方便对象在本线程内不同方法中传递和获取的类.用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离. 本文分享自华为云社区& ...
- IoT技术的最后决战!百万大奖究竟花落谁家?
2022年5月25日华为云IoT创新应用开发大赛决赛路演正式打响! 华为云IoT创新应用开发大赛是华为云面向IoT产业领域的重量级精品赛事,自去年11月上线以来,受到了物联网协会.生态伙伴.产业基地等 ...
- 火山引擎DataLeap数据质量解决方案和最佳实践(二):解决方案
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap流批数据质量解决方案 产品功能架构 火山引擎DataLeap流批数据质量解决方案有 4 个大的功能 ...
- DataLeap的全链路智能监控报警实践(二):概念介绍
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ...
- H-ui JQuery 给单选按纽赋值不生效
H-ui JQuery 给单选按纽赋值不生效 $("#sex-1").attr('checked',true) 原因,iradio-blue 样式的原因 把下面代码注释掉就可以了 ...
- CO01/CO02生产订单组件库存地点替换
一.生产订单组件库存地点替换 当生产订单维护组件点击保存时,根据对应的工厂和工作中心,到配置表中查询对应的库存地点,并将自动带出的库存地点替换 二.隐式增强 在函数CO_VB_ORDER_POST中添 ...
- 网传的Spring大漏洞
昨天凌晨发了篇关于Spring大漏洞的推文,白天就有不少小伙伴问文章怎么删了. 主要是因为收到朋友提醒说可能发这个会违规(原因可参考:阿里云因发现Log4j2核弹级漏洞但未及时上报,被工信部处罚),所 ...
- AcWing 每日一题 - 暑假
本篇解题记录题源来自 AcWing 的每日一题 · 暑假 补题链接:Here Week 1 星期四 AcWing 3761. 唯一最小数 利用 map 存出现过数的下标和次数即可 vector< ...