`
haoningabc
  • 浏览: 1482084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm调优应该知道的一点东西

    博客分类:
  • java
阅读更多
概念

概念
Java 工具
jstat
jmap
VisualVM
调优总结
分代
年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

老年代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中。因此,可以认为老年代中存放的都是一些生命周期较长的对象。

持久代:

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

何时GC
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC(Monitor GC)和Full GC。

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

Java 工具

jstat

jstat -gcutil [pid] [internal]
监视VM内存内的各种堆和非堆的大小及其内存使用量
[pid]: java进程id
[internal]: 打印内存使用量间隔, 单位毫秒
[@hostname ~]# jstat -gcutil 22792 1000
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
11.10   0.00   9.01   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  13.78   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  14.20   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  15.64   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  16.91   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  18.26   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  18.28   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  19.20   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  20.14   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  20.20   3.33  99.98     96    1.045     1    0.094    1.138
11.10   0.00  21.36   3.33  99.98     96    1.045     1    0.094    1.138
S0: Survivor space 0 区已使用空间的百分比
S1: Survivor space 1 区已使用空间的百分比
E: Eden space 区已使用空间的百分比
O: Old space 区已使用空间的百分比
P: Perm space 区已使用空间的百分比
YGC: Young GC 的次数
YGCT: Young GC 所用的时间 单位秒
FGC: Full GC 的次数
FGCT: Full GC 所用的时间 单位秒
GCT: 用于垃圾回收的总时间 单位秒
jmap

jmap -heap [pid]
查看java进程VM已分配空间及使用情况
[pid]: java进程id
[@zjm_106_154 ~]# jmap -heap 22792    
Attaching to process ID 22792, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.0-b09

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40                            # 对应jvm启动参数 -XX:MinHeapFreeRatio 设置JVM堆最小空闲比率 (默认40)
   MaxHeapFreeRatio = 70                            # 对应jvm启动参数 -XX:MaxHeapFreeRatio 设置JVM堆最大空闲比率 (默认70)
   MaxHeapSize      = 10737418240 (10240.0MB)       # 对应jvm启动参数 -XX:MaxHeapSize 设置JVM堆的最大大小
   NewSize          = 5368709120 (5120.0MB)         # 对应jvm启动参数 -XX:NewSize 设置JVM堆的年轻代的默认大小
   MaxNewSize       = 5368709120 (5120.0MB)         # 对应jvm启动参数 -XX:MaxNewSize 设置JVM堆的年轻带的最大大小
   OldSize          = 5439488 (5.1875MB)            # 对应jvm启动参数 -XX:OldSize 设置JVM堆的老年代的大小
   NewRatio         = 2                             # 对应jvm启动参数 -XX:NewRatio 老年代与年轻代的大小比率
   SurvivorRatio    = 8                             # 对应jvm启动参数 -XX:SurvivorRatio 设置年轻代中Eden区与Survivor区的大小比值
   PermSize         = 21757952 (20.75MB)            # 对应jvm启动参数 -XX:PermSize 设置JVM堆的持久带的初始大小
   MaxPermSize      = 1073741824 (1024.0MB)         # 对应jvm启动参数 -XX:MaxPermSize 设置JVM堆的永生代的最大大小

Heap Usage:
PS Young Generation
Eden Space:                                         # Eden区内存分布 总量 已使用 空闲 使用比率
   capacity = 5357305856 (5109.125MB)
   used     = 1647437208 (1571.118553161621MB)
   free     = 3709868648 (3538.006446838379MB)
   30.751225565270396% used
From Space:                                         # 其中一个Survivor区内存分布 总量 已使用 空闲 使用比率
   capacity = 5898240 (5.625MB)
   used     = 2375696 (2.2656402587890625MB)
   free     = 3522544 (3.3593597412109375MB)
   40.278049045138886% used
To Space:                                           # 另一个Survivor区内存分布 总量 已使用 空闲 使用比率
   capacity = 5505024 (5.25MB)
   used     = 0 (0.0MB)
   free     = 5505024 (5.25MB)
   0.0% used
PS Old Generation                                   # 当前老年代内存分布 总量 已使用 空闲 使用比率
   capacity = 5368709120 (5120.0MB)
   used     = 181392168 (172.98905181884766MB)
   free     = 5187316952 (4947.010948181152MB)
   3.3786924183368683% used
PS Perm Generation                                  # 当前持久代内存分布 总量 已使用 空闲 使用比率
   capacity = 72286208 (68.9375MB)
   used     = 72213176 (68.86785125732422MB)
   free     = 73032 (0.06964874267578125MB)
   99.89896827898346% used
VisualVM

remote jvm args
无认证连接(适合测试环境)
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

密码认证连接(用于生产环境) 需配置连接用户和权限([jre]/lib/management/jmxremote.access & jmxremote.password文件) 参考  http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=/usr/local/jdk/jre/lib/management/jmxremote.password

远程主机上启动jstatd进程
jstatd -J-Djava.security.policy=permissions.txt
permissions.txt内容
grant {
  permission java.security.AllPermission;
};
VisualVM里添加远程主机,并为其添加JMX连接和jstatd连接



调优总结

尽量减少Full GC的次数, 因为Full GC的消耗要比Monitor GC要大
年轻代大小: 尽可能设大, 降低年轻代GC次数, 同时也减少达到老年代的对象
分配堆栈的最小值最好等于最大值, 因为动态分配也是需要耗费时间的. 如年轻代, 老年代, 持久代的最小最大值可设为一致
参考

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html  http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
  • 大小: 101.4 KB
  • 大小: 23.6 KB
分享到:
评论

相关推荐

    JVM调优总结

    1.1 JVM调优总结-序3 1.2 JVM调优总结(一)-- 一些概念 4 1.3 JVM调优总结(二)-一些概念 7 1.4 JVM调优总结(三)-基本垃圾回收算法 9 1.5 JVM调优总结(四)-垃圾回收面临的问题 12 1.6 JVM调优总结(五)-分代...

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

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

    JVM调优.pdf

    ### JVM调优详解 #### 一、JVM调优概述 在现代软件开发中,Java虚拟机(JVM)作为Java应用程序的运行环境,对于提高应用程序的性能至关重要。JVM调优是指通过调整JVM的各种参数来优化Java应用程序的运行效率,减少...

    JVM调优工具命令详解.pdf

    在现代的软件开发与运行环境中,Java虚拟机(JVM)的性能调优是非常重要的一环,特别是在处理大型应用程序或者服务时,合适的JVM调优能够显著提升系统性能和稳定性。本篇文档详细介绍了JVM调优工具的命令使用及其...

    马士兵jvm调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...

    JVM调优实践 ⼀、JVM调优准备⼯作 实验报告 pdf

    Java虚拟机(JVM)是Java程序运行的基础,它的调优是提高应用程序性能的关键环节。在JVM调优实践中,了解各个运行时数据区的工作原理至关重要。以下是对这些区域的详细解析: 1. **虚拟机栈**:每个线程都有一个...

    monkey老师的jvm 调优

    《Monkey老师的JVM调优深度解析》 在Java开发领域,JVM(Java Virtual Machine)是每一个程序员都需要深入了解的关键组成部分。Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理...

    jvm调优的实际应用

    《JVM调优实战解析》 在Java开发领域,JVM(Java Virtual Machine)是运行所有Java应用程序的基础,它的性能直接影响着程序的运行效率。因此,掌握JVM调优技术对于提升系统的稳定性和性能至关重要。本文将围绕"JVM...

    马老师jvm调优实战笔记

    马老师 JVM 调优实战笔记 JVM 调优是 Java 开发者们不可或缺的技能,它直接影响着 Java 应用程序的性能和稳定性。本笔记是马老师的 JVM 调优实战笔记,涵盖了 JVM 的概述、内存结构、堆内存、垃圾回收算法、JVM ...

    java高级篇:JVM调优.mp4

    分析常见的JVM调优技术及其相关条件,以及在实战中怎么使用到相关的技术进行调优,比较适合中高级开发进行学习,适合对JVM理解较深的开发学习

    JVM调优实战(转)

    JVM调优实战 本文档旨在介绍JVM调优实战的各个方面,包括JVM内存、垃圾回收、性能优化等。通过对JVM内存结构、垃圾回收机制和性能优化策略的详细讲解,帮助读者深入理解JVM的工作原理和优化方法。 1. JVM内存结构 ...

    jvm调优实战经验

    【JVM调优实战经验】 在Java开发中,JVM(Java Virtual Machine)的调优是提高应用程序性能的关键环节。JVM调优涉及到对内存管理、垃圾回收机制以及相关参数的调整,以优化应用程序的运行效率和稳定性。本文将深入...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 ...JVM调优:命令行指令,设置堆内存大小的参数

    JVM调优总结.pdf

    JVM调优是一个复杂的过程,它涉及到对Java虚拟机内部工作原理的深刻理解。本文档总结了JVM调优的基础知识和一些核心概念,旨在帮助开发者更好地掌握Java程序的性能优化。 首先,文档提到了Java中的数据类型分为基本...

    JVM调优总结 JVM调优总结

    ### JVM调优总结 #### 一、概述 Java虚拟机(JVM)是Java程序的核心运行环境,对于提高Java应用程序性能至关重要。JVM调优是指通过调整JVM的配置参数来优化程序性能的过程。本文将围绕JVM调优展开讨论,重点分析数据...

    JVM调优总结PDF,带原理图

    ### JVM调优与垃圾回收机制详解 #### 一、引言 随着软件系统的复杂度不断提高,性能优化成为了软件开发中的一个重要环节。对于Java应用程序来说,Java虚拟机(JVM)的性能直接影响着应用的整体表现。垃圾回收(GC)...

    java6 JVM 调优参数大全

    java6 JVM 调优参数大全 -XX

    JVM调优篇.pdf

    JVM类加载机制详解 JVM类加载机制是Java虚拟机中的一种机制,它负责加载Java类文件到内存中,以便执行Java程序。类加载机制分为五个阶段:加载、验证、准备、解析和初始化。 加载 加载是类加载过程中的一个阶段,...

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

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

Global site tag (gtag.js) - Google Analytics