JVM调优-解决native heap持续增长

2023-05-16

问题的提出,分析,请参考JNI——小心,内存怪兽出没

(简单的说起来,就是java进程占用了4G内存,但是折腾来折腾去,整个JVM的堆才100M上下,其余的内存凭空消失?刨根问底之后,原来是native heap占用了内存)

看完上面的问题,再来看解决方案:

 

 

 

目前看来,通过调整 JVM 参数来加大 GC 触发的频率是比较现实的一种方式。下面是一些分析过程:

 

一.       判断 Memonry 内存所属的区


通过 jconsole 可以看到 gc 信息,其中新生代的 scavenge 回收比较频繁,如果 Memonry 在这个区应该不存在长期得不到 gc 的情况

由此推测 Memory 应该是在 Tenured/old ,而这个区的内存回收次数恰好非常少。 当然参数优化的目标,就是加大 old 区的 gc 频率。

 

二.       观察 JVM 的堆参数配置

1. 默认配置下,堆的分配起始值为 126M ,最大 1.8G  


 

2. 观察 gc 前后 java 整个堆 的使用情况, gc 前大概占 130M, 远未达到默认设置下的内存容量


 

3. 进一步查看 old 区的内存 ,发现在 gc 前稳定在 90M

而默认参数初始分配 85M ,最大 1.3G ,显然很难触发到 GC


 

三.       解决问题

1. 首要的问题就是控制 JVM 对整个 heap 的大小分配:

 -Xmx300M    指定 jvm 的最大 heap 大小 ,

          -Xms40M   指定 jvm 的最小 heap 大小 ,

 

2. 在减小了整个堆的前提下,优化 NewRatio 这个参数 ( 指定 jvmOld Generation heap sizeNew Generation 的比例 )

            将默认的 NewRatio=2 更改为更符合业务实际内存使用比例的  -XX:NewRatio=1 

           减小了 old 区的比例,更容易触发 gc

 

         3. 另外一个猜测的可行方案:(有待验证)

启用 jvm 中的 gc 参数 -XX:MaxGCPauseMillis=<nnn>

这个参数的大概含义就是,让每次 gc 的时间不超过参数 nnn 。那么 nn 减少的时候,必然会增加到 gc 的次数,来换取每次 gc 的速度。

通过下图的数据可以求出,每次 old 区的 gc 平均耗时 34.7ms 那么可以   -XX:MaxGCPauseMillis=28 ,也许会增加到 gc 频率。


 

 

上述 4 个标红参数已经添加 ,观察几天得到的结论是,比较好的解决了这个问题。

====================================================================

分割线:下面是调优后的观察:

 

可以看到整个内存呈波动结构,Java的堆从20M--》60M就触发一次old区的gc。

下面看看GC的情况: MarkSweep是old区的gc策略,大概2个小时会触发一次,每次耗时

3194/112=28.5178ms,不会对应用产生明显的停摆,并且也验证了MaxGCPauseMillis参数的作用


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM调优-解决native heap持续增长 的相关文章

随机推荐

  • 在UEFI模式下,linux误删EFI分区后,重新恢复引导

    遇到上面情况 xff0c 我们通常使用boot repair修复引导 但是这时会弹出一个错误 xff1a GPT detected Please create a BIOS Boot partition 遇到这个情况以后 xff0c 我就疯
  • mysql 报错ERROR 1064 (42000),原因使用了mysql保留字

    执行select语句 xff1a select from cfg parameter where key 61 39 nSJtifqVSI7HkPrKHlxhD6 39 ERROR 1064 42000 You have an error
  • Unable to preventDefault inside passive event listener due to target being treated as passive.

    最近做项目经常在 chrome 的控制台看到如下提示 xff1a Unable to preventDefault inside passive event listener due to target being treated span
  • GBK 编码

    GBK编码范围 xff1a 8140 xff0d FEFE xff0c 汉字编码范围见第二节 xff1a 码位分配及顺序 GBK编码 xff0c 是对GB2312编码的扩展 xff0c 因此完全兼容GB2312 80标准 GBK编码依然采用
  • 子类能否重写父类的静态方法?

    今天在看到了一道面试题 xff0c 题目是一道代码阅读题 xff0c 问下面的代码输出结果是什么 xff1f 我最开始的理解 xff1a 上面的代码我们可以看到 xff0c 上面的类中有两个内部类Sub和Super xff0c Sub继承了
  • Blazor 从入门到放弃

    Blazor 从入门到放弃 Intro Blazor 是微软在 NET 里推出的一个 WEB 客户端 UI 交互的框架 xff0c 使用 Blazor 你可以代替 JavaScript 来实现自己的页面交互逻辑 xff0c 可以很大程度上进
  • WPF知识学习

    RelativeSource 61 RelativeSource AncestorType 61 x Type Window 是一种 WPF XAML 绑定方式 xff0c 它表示要从当前控件的父级元素中找到类型为 Window 的元素 x
  • C#表达式树解析步骤

    C 表达式树是一种将 C 代码表示为对象树的方式 xff0c 它提供了一种在运行时动态构建和执行代码的能力 表达式树可以用于构建 LINQ 查询 动态生成代码 ORM 框架等场景 表达式树的解析过程可以分为两个步骤 xff1a 构建表达式树
  • 关于ConstraintLayout自适应高度遇到的坑

    关于ConstraintLayout自适应高度遇到的坑 记录下来 android layout height 61 34 wrap content 34 为了缩减嵌套层及采用了ConstraintLayout作为dialog布局 但是发现d
  • FluentValidation使用示例

    FluentValidation 是一个 NET 平台下的验证库 xff0c 用于验证对象的属性是否符合预期的规则 它提供了一种简洁的方式来编写验证规则 xff0c 支持链式编程 xff0c 可以轻松地构建复杂的验证逻辑 在 NET 6 中
  • SQLServer创建索引的5种方法

    前期准备 xff1a span class hljs operator span class hljs keyword create span span class hljs keyword table span Employee ID s
  • 正则表达式(匹配第一个花括号)

    学习正则 xff0c 工作中使用正则让我对 有了新的认知 xff1a 正则中 匹配输入字符串的开始位置 xff0c 除非在 方括号表达式中使用 xff0c 此时表示不接受该字符集合 废话不多说 xff0c 直接看栗子吧 xff0c 如下图所
  • windows驱动注册中断服务程序

    一个驱动程序的标准中断服务例程的必要功能和建立一个ISR的需求 1 1 ISR需求 一个产生中断的物理设备的所有驱动程序必须有一个ISR 中断服务例程由内核定义如下 xff1a span class hljs built in BOOLEA
  • Android Studio 出现“Cannot resolve symbol” 解决办法

    一 Android Studio 无法识别同一个 package 里的其他类 xff0c 将其显示为红色 xff0c 但是 compile 没有问题 鼠标放上去后显示 Cannot resolve symbol XXX xff0c 重启 A
  • input[type=file] 获取上传文件的内容

    上代码 xff1a span class token tag span class token tag span class token punctuation lt span input span span class token att
  • 解决pyinstaller打包后C盘出现 windows/TEMP/_MEI文件夹爆满的问题

    背景 xff1a 一每分钟执行的python脚本 xff0c 打包成exe后 xff0c 在有些机器出现 IME文件过多的问题 解决 xff1a 1 参考 Python转exe方法与 MEI清除方法 Don 39 t expect me t
  • 关于Android studio 升级到4.2文件缺失问题

    一 背景 当我把Android studio 开开心心的更新到4 2版本后 xff0c 结果就爆了一个类文件找不到的异常 xff08 如下图 xff0c 幸好只有一个 关于这个类的缺失是高版本JRE中剔除了这个类 xff0c 那只要把And
  • 求正整数n所有可能的和式的组合

    求正整数n所有可能的和式的组合 xff08 如 xff1b 4 61 1 43 1 43 1 43 1 1 43 1 43 2 1 43 3 2 43 1 43 1 2 43 2 xff09 首先说一下 xff0c 群里面很多人在问这个东东
  • Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:t

    今日份遇到的 bug xff1a Error 注 某些输入文件使用或覆盖了已过时的 API 注 有关详细信息 请使用 Xlint deprecation 重新编译 注 某些输入文件使用了未经检查或不安全的操作 注 有关详细信息 请使用 Xl
  • JVM调优-解决native heap持续增长

    问题的提出 xff0c 分析 xff0c 请参考JNI 小心 xff0c 内存怪兽出没 xff08 简单的说起来 xff0c 就是java进程占用了4G内存 xff0c 但是折腾来折腾去 xff0c 整个JVM的堆才100M上下 xff0c