`

JVM & Memory (5) final

    博客分类:
  • java
阅读更多

转自:http://spaces.msn.com/songsun/

 

先说tuning,gc有两个指标,一个是frequentcy(以下称F),一个是duration(以下称D)。 前者和程序产生garbage的速率和java heap大小有关,后者和java heap大小及gc thread数有关。依据应用程序的差异,F可能为30秒/次或者数小时/次不等,都是可接受的,而D则越短越好,因为它jvm让人感到pause的时 刻。在应用程序和gc thread数给定的条件下,F和D是矛盾的,一个的减小意味着另一个的增大,因为F低了,说明heap size很大,而大的heap意味着gc要花费较多的时间,即D要增加,反之亦然。下面是几条准则:

  1. 你应该设置gc thread数与系统的cpu个数一致,道理很简单,多了是无用的,少了是浪费cpu。
  2. min heap size应该设置在java heap的谷值或略大的水平,谷值和峰值如果没有profiling工具,打开-verbose:gc做计算。
  3. max heap size约设置为java heap峰值的10/7倍,也就是max heap size的70%约等于峰值。也可以更大些,2倍左右。一定要注意物理内存的多寡,不要大得被paging到硬盘上去了,那就得不偿失了。
  4. 最后,稳定压倒一切,继续用-verbose:gc观测一段时间(有时甚者要多天),看看F和D是否可以保持在稳定的水平上。如果排出额外因素的影响还是波动太大,说明还需要进一步调节。
以上是一般过程,当然,你还应该参考所使用的jvm的document,注意其特征。

续trouble shooting
内 存方面的trouble shooting主要就是解决OutOfMemory(以下简称OOM),导致OOM的原因总的来说有2种:第一是内存泄露,随着运行时间增加,内存逐渐 吃紧,终于不治;第二是实际需要大于最大heap size,也就是说-Xmx太小了,需要调高(如果你上面的tuning做好了,就不会这样了 )。 直接原因就五花八门了,比如有的jvm,当在80%的cpu时间内,不能gc出2%的heap时,也发生OOM,还有一种可能是,你的heap实际使用并 不大,free空间总数是充足的,但不巧的是free空间都是碎片而heap又不能compact,那么内存分配请求失败,发生OOM。

一般发生OOM时,jvm会导出heapdump,即使你对系统一无所知,只拥有一个heapdump就足以了。IBM alphaWorks上有一个HeapRoots 工具可以用来分析heapdump(最好使用ibm的jre运行该工具,对于有些phd格式的堆,还用当使用svcdump.jar )。
假如你没有heapdump可用,那么需要检查系统是否禁止了heapdump,甚至有时需要手工使jvm产生heapdump(unix环境下,kill -3 pid,win32下,ctrl+break)。
一切就绪后,使用命令行
>  java -Xbootclasspath/p:svcdump.jar -Xmx768M -jar HR207.jar -i heapdump.xxxx.phd
注意:如果heapdump文件本身很大,
-Xmx768M需要增大;分析时尽量使用高配置的计算机,否则太慢,你会比较郁闷。

启动heaproots作分析,load完毕后:
  • 输入p命令(help可以列出所有命令的注释)作预处理。
  • 然后使用ot和ts分析对象和类所占空间的排序,默认列出前25个。
  • 过程中过滤器很有用,com/foo为过滤则仅输出com.foo为前缀类型。
  • 所占堆排名靠前的那些类别或对象,需要检查是否是内存泄露的结果或者是否有代码优化的余地。
  • 如果对某对象感兴趣,使用i 0x<addr>命令深入追踪之。

注:一般发生OOM时,有的jvm在heapdump之前,会作一次gc,以利对堆的分析。

再注:以上的手段在实际中多次应用,有效率达99.9999%以上!

分享到:
评论

相关推荐

    小菜鸟系列-JVM体系结构

    5. **内存模型(Java Memory Model, JMM)** JMM规定了线程如何访问和修改共享变量,确保并发程序的正确性。它定义了 volatile、synchronized 和 final 关键字的行为,并规定了 Happens-Before 关系。 了解JVM的...

    JVM和性能优化学习思维笔记_swim5we_jvm_性能优化_

    5. **JVM参数调整**:通过设置-Xms、-Xmx控制堆内存大小,-XX:NewRatio调整新生代和老年代比例,-XX:SurvivorRatio设定新生代中Eden和Survivor的比例,-XX:MaxHeapFreeRatio、-XX:MinHeapFreeRatio控制堆空闲空间,...

    JVM核心知识点梳理以及JVM面试题总结

    包括文本字符串、基本类型、final常量、类信息等。符号引用在运行时被解析为直接引用,实现动态链接。 3. **虚拟机栈(JVM Stack)** - **栈帧(Stack Frame)**:每个线程有自己的虚拟机栈,每个方法调用对应一个...

    了解jvm

    5. JConsole:图形界面的JVM监控工具。 总结,了解JVM对于Java开发者至关重要,它涉及类加载、内存管理、垃圾收集、性能优化等多个方面。深入研究JVM源码,结合使用各种JVM工具,可以提升我们的编程能力和问题解决...

    JVM内存结构.zip

    5. **程序计数器(Program Counter Register)** 这是最小的一块内存区域,用于记录当前线程正在执行的字节码指令的地址。如果线程正在执行的是一个Java方法,计数器记录的是虚拟机字节码指令的地址;如果是native...

    解密Java虚拟机(带目录)

    5. **内存模型(Java Memory Model, JMM)**:定义了线程之间的共享变量如何交互和可见性。 volatile关键字、synchronized和final关键字都在此模型中扮演重要角色。 6. **类加载与双亲委派模型**:为了保证类加载的...

    使用Java的Memory Model实现一个简单的计数器.txt

    Java Memory Model (JMM) 是Java虚拟机(JVM)的一个核心概念,它定义了程序中的各种变量(线程共享变量)的访问规则以及这些变量在各个线程之间的可见性问题。JMM的核心目标是解决由线程交替执行和现代计算机内存系统...

    java虚拟机

    5. **JVM性能调优** 通过设置JVM参数,可以优化内存分配、垃圾收集策略、线程管理等。例如,`-Xms` 和 `-Xmx` 分别设置堆内存的初始大小和最大大小,`-XX:+UseG1GC` 开启G1垃圾收集器。 6. **JVM内存模型** Java...

    java内存模型.pdf

    Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)规范的一部分,它定义了共享变量的访问规则和内存操作的细节。Java内存模型在并发编程中非常重要,因为它规定了线程如何和何时可以看到由其他线程修改的...

    jdk-18.0.2.1_windows-x64_bin.exe.zip

    5. **Foreign function & memory API(外部函数和内存API)**:提供了一种安全的方式,让Java代码能够直接调用本地(非Java)代码和管理非Java内存,提高了性能。 安装JDK 18.0.2.1_windows-x64_bin.exe后,开发者...

    Java运行内存分析

    除了上述内存区域外,Java还支持直接内存(Direct Memory),这部分内存并不由JVM直接管理,而是通过NIO(New Input/Output)类调用本地方法直接分配在Java堆外的内存,这些内存可以用来建立大型缓存等,从而提高IO...

    虚拟机原理ver2-CD

    5. **垃圾收集**:JVM有自动的内存管理系统,负责回收不再使用的对象,以避免内存泄露。不同的垃圾收集算法,如标记-清除、复制、标记-整理和分代收集,各有优缺点,选择合适的策略能提高性能。 6. **内存模型...

    深入理解JAVA内存模型。。

    Java内存模型(JVM Memory Model,简称JMM)是Java平台中的核心概念,它定义了程序中各个线程如何共享和访问数据,以及在多线程环境下如何保证数据的一致性。深入理解JMM对于编写高效、可靠的并发程序至关重要。 1....

    虚拟机内存结构和垃圾回收docx.pdf

    1. 方法区(Method Area):存储类信息、静态变量、构造函数、final常量、类字段和方法等。在Hotspot虚拟机中,这部分对应持久代(Permanent Generation),当方法区超出其限制时,会抛出`OutOfMemory: PermGen ...

    深入理解JAVA内存模型(高清完整版)

    Java内存模型(JVM Memory Model,简称JMM)是Java平台中的一个重要概念,它定义了在多线程环境下,如何在共享内存中读写数据,以及如何保证数据的一致性和可见性。本教程《深入理解JAVA内存模型》将带你深入探讨这...

    深入理解Java内存模型(一)共3页.pdf.zip

    JVM在编译时或运行时会插入适当的内存屏障来保证JMM的正确性。 4. **happens-before原则**: - 这是JMM中的一个重要概念,它定义了两个操作的相对顺序。如果操作A happens-before 操作B,那么在所有线程中,A的...

    java内存管理[归类].pdf

    5. **栈内存(Stack Memory)**:每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。局部变量、方法参数和方法执行过程中的临时数据都在栈中存储,当方法执行完毕,栈帧会被弹出,其占用的内存也随之释放。 6. ...

    Java宝典(第一版)

    - 掌握常用的关键字如`final`、`static`、`abstract`等的意义和用法。 **1.2.5 使用集合框架** - 理解`List`、`Map`、`Set`等接口及其具体实现类的区别和适用场景。 - 学会如何遍历这些集合,并针对不同的需求选择...

    Java核心技术大全

    - Java中有许多关键字,如`public`、`private`、`static`、`final`等,理解它们的作用域和使用场景对于编写高质量的代码至关重要。 **1.2.5 使用集合框架** - 掌握`List`、`Set`、`Map`等接口及其典型实现类(如`...

    java内存模型详解--非常经典

    Java内存模型(JVM Memory Model,简称JMM)是Java平台中的一个重要概念,它定义了程序中各个变量的访问规则,以及在多线程环境下的内存一致性效果。JMM主要解决的是并发环境下不同线程之间如何共享数据以及如何保证...

Global site tag (gtag.js) - Google Analytics