`
sw1982
  • 浏览: 511349 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

问题的提出,分析,请参考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 这个参数 ( 指定 jvm Old Generation heap size New 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参数的作用


 

 

  • 大小: 46.3 KB
  • 大小: 49.2 KB
  • 大小: 122.7 KB
  • 大小: 61.5 KB
  • 大小: 31 KB
  • 大小: 3.9 KB
  • 大小: 10.1 KB
2
1
分享到:
评论
6 楼 tictac 2011-06-09  
beneo 写道
sw1982 写道
beneo 写道
我感觉很奇怪,native heap为啥会在old区,但是jvm heap 却不显示出来。。不明白不明白

这个问题就看开头引用了同事的一篇文章分析。 native heap是不属于JVM堆管理的,但是产生natvie heap对象的引用类又出现在JVM的heap中,并且长期得不到gc处理。


那这完全变成了如何让OLD代更快GC了。。那就有些无聊了。。

设置:-XX:MaxDirectMemorySize值,可以吗?
5 楼 beneo 2010-07-30  
宋兄弟的这文章很赞
4 楼 beneo 2010-07-30  
sw1982 写道
beneo 写道
我感觉很奇怪,native heap为啥会在old区,但是jvm heap 却不显示出来。。不明白不明白

这个问题就看开头引用了同事的一篇文章分析。 native heap是不属于JVM堆管理的,但是产生natvie heap对象的引用类又出现在JVM的heap中,并且长期得不到gc处理。


那这完全变成了如何让OLD代更快GC了。。那就有些无聊了。。
3 楼 sw1982 2010-07-30  
beneo 写道
我感觉很奇怪,native heap为啥会在old区,但是jvm heap 却不显示出来。。不明白不明白

这个问题就看开头引用了同事的一篇文章分析。 native heap是不属于JVM堆管理的,但是产生natvie heap对象的引用类又出现在JVM的heap中,并且长期得不到gc处理。
2 楼 beneo 2010-07-30  
我感觉很奇怪,native heap为啥会在old区,但是jvm heap 却不显示出来。。不明白不明白
1 楼 beneo 2010-07-30  
好文章,第一次知道有个native heap

为什么要配置成full gc呢??丢到Eden或者S(2)就消灭了岂不是更好

相关推荐

    JVM调优总结 -Xms -Xmx -Xmn -Xss

    JVM调优总结 -Xms -Xmx -Xmn -Xss JVM 调优是 Java virtual machine 的性能优化,通过调整 JVM 的参数来提高 Java 应用程序的性能。其中,-Xms、-Xmx、-Xmn、-Xss 是四个重要的参数,分别控制 JVM 的初始堆大小、...

    练习JVM调优-jvm_demo.zip

    "练习JVM调优-jvm_demo.zip"是一个压缩包,包含了用于JVM调优实践的示例项目"jvm_demo-master"。通过这个项目,我们可以深入学习和理解JVM的工作原理和调优技术。 1. **JVM结构与工作原理**: - 类加载器:加载、...

    jvm调优-jvm.zip

    1. **内存模型**:JVM内存分为堆内存(Heap)、方法区(Method Area)、栈内存(Stack)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。理解这些区域的作用和大小设置对调优至关重要。 2. **堆...

    Tomcat JVM调优-TomcatJVM.zip

    《深入解析Tomcat JVM调优》 在Java应用服务器领域,Tomcat因其轻量级、高效和开源的特点,被广泛应用于各种Web应用的部署。然而,为了确保应用的高性能和稳定性,对Tomcat的JVM进行优化是必不可少的环节。本文将...

    带你全面理解JVM,掌握常规JVM调优-JVM.zip

    在这个全面理解JVM并掌握常规JVM调优的教程中,我们将深入探讨JVM的工作原理、内存模型、垃圾收集机制、类加载过程以及如何进行性能优化。 一、JVM工作原理 JVM的运行过程包括编译、加载、验证、解析、初始化、执行...

    学习juc、nio、netty、tomcat调优、jvm调优-Advanced-JAVA.zip

    本资料主要涵盖了五个核心领域:Java并发(JUC)、非阻塞I/O(NIO)、Netty框架、Tomcat服务器优化以及Java虚拟机(JVM)调优。以下是这些主题的详细说明: 1. **Java并发(JUC - Java Concurrency Utilities)** ...

    JVM 参数调优-optimization-jvm.zip

    1. **JVM内存模型**:JVM内存主要分为堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。了解每个区域的作用和配置参数...

    JVM调优总结 Xms -Xmx -Xmn -Xss

    ### JVM调优总结:Xms、Xmx、Xmn、Xss 在Java虚拟机(JVM)的运行过程中,合理的参数配置对于提高程序性能至关重要。本文将对JVM调优中的几个关键参数进行深入解析,包括-Xms、-Xmx、-Xmn和-Xss等,帮助开发者更好...

    jvm-full-gc调优-jvm-full-gc.zip

    本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何减少和优化JVM的Full GC进行深入探讨的。以下将详细介绍JVM Full GC的相关知识点。 1. **理解JVM内存结构**:Java内存主要分为堆内存(Heap)和非堆内存...

    Jvm调优练习-jvm-tuning.zip

    【标题】"Jvm调优练习-jvm-tuning.zip" 提供了一个实践 JVM(Java Virtual Machine)调优的机会,这是一项至关重要的技能,特别是在处理大型、高性能的Java应用程序时。JVM调优涉及到调整一系列参数,以优化应用程序...

    用于测试jvm gc调优-share-jvm-gc.zip

    "用于测试jvm gc调优-share-jvm-gc.zip"这个压缩包文件很可能包含了一些工具、脚本或教程,用于帮助我们了解和实践JVM的垃圾收集优化。 首先,我们需要理解JVM GC的基本原理。垃圾收集器的主要任务是识别并回收不再...

    JVM性能调优-JVM内存整理及GC回收

    总之,《JVM性能调优-JVM内存整理及GC回收》是JAVA程序员提升自身技能,优化代码执行效率,解决内存问题的宝贵资源。通过深入学习,开发者可以更好地理解JVM的工作机制,从而编写出更加高效、稳定的Java应用程序。

    Java性能监控与调优Demo,主要学习各种JDK监控工具以及jvm调优-monitor_tuning_Demo.zip

    这个名为"monitor_tuning_Demo"的压缩包文件,很显然是为了教授如何使用JDK提供的监控工具以及进行JVM(Java虚拟机)的调优。在实际应用中,这些工具和技术对于优化Java应用性能、定位问题以及确保系统健康运行至关...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    java虚拟机调优--某培训班的课件与源码

    1. **内存模型**:JVM内存分为堆内存(Heap)和非堆内存(Non-Heap),其中堆内存又细分为新生代(Young Generation)、老年代(Tenured Generation)和永久代(Permanent Generation或元空间)。理解这些区域的作用...

    jvm调优测试仓库-jvm-monitor.zip

    4. "jvm-monitor-master":此项目可能是一个定制化的JVM监控解决方案,具体功能需查看源代码和文档以了解详情。 三、JVM调优实践 1. 堆内存调整:根据应用的内存需求,合理设定堆大小,避免Full GC频繁发生。 2. ...

    jvm性能调优-jvm内存模型和优化-performance-jvm-memorymodel-optimize.zip

    JVM内存模型和优化是Java性能调优的核心部分,理解并熟练掌握这些知识,能够帮助开发者解决实际问题,提升系统的运行效率。通过合理配置JVM参数,结合使用各种监控和诊断工具,我们可以有效地发现和修复性能问题,让...

    jvm参数调优-jvm.zip

    Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及优化代码性能。JVM参数调优是提升Java应用程序性能的关键环节,尤其是在高并发、...同时,持续的监控和性能测试是确保调优效果的关键。

    jvm基础知识与调优-jvm-training.zip

    这个“jvm-training”资料包涵盖了JVM的核心概念、内存管理、垃圾回收机制、性能优化等方面的知识。 1. **JVM架构** - 类加载器:JVM通过类加载器将.class文件加载到内存,分为引导类加载器、扩展类加载器和应用...

Global site tag (gtag.js) - Google Analytics