`

JVM学习与调优

    博客分类:
  • java
jvm 
阅读更多

 

 

 

1 堆:存放数据

  栈:存放逻辑

2 虚拟机: 栈溢出,则栈大小设置-Xss  默认值为1M 但一般会不到200k,所以会将默认值调整小点 

  

Java虚拟机本身:-Xms,-Xmx,-Xss;

系统限制:

/proc/sys/kernel/pid_max,

/proc/sys/kernel/thread-max,

max_user_process(ulimit -u),

/proc/sys/vm/max_map_count。

 

3 堆内存溢出

强引用内存泄露:new 出来的对象是基本上是强引用,这种引用申请不到内存,则内存泄露 。

    强引用环境,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用则不会被回收。

软引用:当做缓存来用(内存受限的时候用,否则用强引用更好),当垃圾回收时候,如果内存紧张则软引用会被回收,否则不回收。

 

弱引用(与软引用类似):申请不到内存则会进行内存回收,不会有内存泄露 

 

4 垃圾回收算法:

  1 引用为0

  2 标记清楚,它会遍历整个堆来标记无用的对象,  ()

  3 复制回收 

  四个区: e,s0,s1 ,old ,每次回收后剩下的对象会向后面的区转移 ,前三个为新生代,old为老年代 

  4 标记整理:

 

5 出发回收:

  1) Scavenge: e区申请空间失败(即满了),则出发此回收

  2)full GC:比较慢,尽量减少这种GC使用,一下会产生这种GC

     年老带写满、持久带写满、System.gc、上一次GC后Heap各个区域分配策略动态变化

 

6 配置垃圾回收器  

串行垃圾回收器:数量比较小,100M左右,一般单处理器对响应时间无要求 : -XX:+UseSerialGC 

并行垃圾回收: 特点:,但吞吐量高。适合, 多核多处理器,响应时间无要求的中大型应用:-XX:+UseParallelOldGC , -XX:ParalleGCThreads 并行线程数量

  最大暂停时间:-XX:MaxGCPauseMills=N ,如后台处理,科学计算

  吞吐量:-XX:GCTimeRatio=N

并发处理器:“响应时间高要求”多cpu,对响应时间有较高要求的中大型应用,如web服务器,应用服务器,集成开发环境

     

7 常见配置汇总:

  堆设置:

  -Xms:初始堆大小 <4G 

  -Xmx:最大堆大小 <4G

  -XX:NewSize=n:设置年轻带大小

  -XX:NewRatio=n设置年轻带和年老带的比值。如为3,则年轻带与年老带比值为1:3

 年轻带占整个年轻带年老带和的1/4

   -XX:SurvivorRatio=n :年轻带中Eden区与两个Survivor区的比值。。

 注意Survivor区有两个。如:3表示Eden:Survivor=3:2一个Survivor区占整个年轻带的1/5

  -XX:MaxPermSize=n 设置持久代大小

  收集器设置:

   -XX:+UseSeralGC 设置串行收集器

   -XX:+UseParallelGC 设置并行收集器

   -XX:+UseParalledlOldGC 设置并行年老带收集器

   -XX:+UseConcMarkSweepGC:设置并发收集器 

   垃圾回收统计信息:打印垃圾回收信息,以便查看参数设置是否正确

   -XX:+PrintGC

   -XX:+PrintGCDetails

   -XX:+PrintGCTimeStamps

   -Xloggc:filename 

 

  测试堆栈设置:打印gc信息,并且打印出堆溢出的问题-Xms50m -Xmx50m -verbose:gc -Xrunhprof:heap=sites

 

  并行收集器设置:

    -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数,并行线程数。

    -XX:MaxGCPauseMillis=n: 设置并行收集最大暂停时间

    -XX:GCTimeRatio=n 设置垃圾回收时间占程序运行时间的百分比:公式1/1+n

 

  并发收集器设置:

  -XX:+CMSIncrementalMode  设置为增量模式 适用单CPU

  -XX:ParallelGCThreads=n  设置并发收集器年轻带收集方式为并行收集器,使用CPU

 数。并行收集器线程数

 

JVM中最大堆大小的三方面限制:相关操作系统数据模型限制(32还是64位);系统可用虚拟内存限制;

系统的可用物理内存限制。32位系统下,一般限制在1.5-2G。

64位操作系统内存无限制 。windows Server 2003系统,3.5G物理内存,

JDK5.0下测试最大设置为1478m

典型设置1:

java -Xmx3550m-Xms3550m-Xmn2g-Xss128k

-Xmx3550m: 设置JVM最大可用内存为3550M

-Xms3550m:设置JVM初始内存为3550M。这个值设置与-Xmx形同,以避免每次

垃圾回收后JVM重新分配内存。

-Xmn2g:设置年轻带大小为2G。整个堆大小=年轻代+年老代大小+持久代大小。

持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。

此值对系统性能影响较大,Sun官方推荐为整个堆大小3/8.

 -Xss128k:设置每个线程堆栈大小。以后每个线程堆栈大小为1M,以前每个线程

堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,

减小这个值能生成更多的线程。但操作系统对一个进程内的线程数还是有限制的,

不能无限制生成,经验值为3000-5000左右。

典型设置2:

 java-Xmx3550m-Xms3550m-Xss128k-XX:NewRatio=4-XX:SurvivorRatio=4

 -XX:MaxPermSize=16m-XX:MaxTenuringThreShold=0

 -XX:newRatio=4 :设置年轻带(包括Eden和两个S区)与年老带的比值(除去持久代)

设置为4,则年轻带与年老代所占比值为1:4,年轻带占整个堆栈的1/5.

 -XX:SurvivorRatio=4 :设置年轻代中Eden与Survivor区的大小比值。设置为4,则两个Survivor区

与一个Eden区的比值为2:4,一个Survivor区占整个年轻带的1/6

-XX:MaxPermSize=16m :设置持久代大小为16m

-XX:

MaxTenuringThreshold=0 设置垃圾最大年龄。如果设置为0,则年轻带对象不经Survivor区,直接

进入年老代。对于年老代比较多的应用可以提高效率,如果将此值设置为一个较大的值,则

年轻代对象会在S区进行多次复制,则会增加对象年轻代存活时间.

8 回收器选择:

JVM给了三种回收器:串行收集器,并行收集器,并发收集器

默认JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时候加入相应参数。

jdk5.0以后JVM会根据当前系统配置

 

吞吐量优先的并行收集器:

并行收集器主要是以达到一定吞吐量为目标,适用科学技术和后台处理器:

典型配置:

 

java-Xmx3800m-Xms3800m-Xmn2g-Xss128k-XX:+UseParallelGC

-XX:ParallelGCThreads=20

-XX:+UseParalelGC:选择垃圾收集器为并行收集器。此配置对年轻代有效。

即上述配置下,年轻代适用并发收集,而年老带仍旧适用串行收集。

-XX:ParallelGCThreads=20: 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。

此值最好配置与处理器数目相等。

 

java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:+UseParallelGC

-XX:ParallelGCThreads=20-XX:+UseParallelOldGC

-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0

支持对年老代并行收集。

 

java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:+UseParallelGC

-XX:MaxGCPauseMillis=100

-XX:MaxGCPauseMillis=100 设置年轻代垃圾回收的最长时间,如果

无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

 

java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:+UseParallelGC

-XX:MaxGCPauseMillis=100-XX:+UseAdaptiveSizePolicy

-XX:+UseAdaptiveSizePolicy 设置此选项,并行收集器会自动选择年轻代区大小

和相应的Survivor区的比例,以达到目标系统规定的最低响应时间或者

收集频率,建议使用并行收集器时,一直打开。

 

    响应时间优先并发收集器:主要保证系统响应时间,减小垃圾手机时的

停顿时间,适用于应用服务器,电信领域等。

 

java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:+UseParallelGCThreads=20

-XX:+UseConcMarkSweepGC-XX:+UseParNewGC

-XX:+UseConcMarkSweepGC设置年老代并发收集,测试中配置这个后,

-XX:NewRatio=4的配置失效了。所以此时配置年轻带最好用-Xmn设置。

-XX:+UseParNewGC 设置年轻带为并行收集。可以与CMS收集同时使用。

   JDK5.0以后自动设置,所以无需设置。

 

java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:UseConcMakSweepGC

-XX:CMSFullGCsBeforeCompaction=5-XX:UseCMSCoimpactAtFullCollection 

-XX:UseCMSCoimpactAtFullCollection  :由于并发收集器不对内存空间进行空间压缩、整理,所以运行

一段时间后会产生碎片,使得运行效率降低。此值运行多少次GC后对

内存空间进行压缩,整理。

-XX:UseCMSCoimpactAtFullCollection :打开对年老带的压缩。可能会影响性能,但会产生碎片

 

总结:

年轻代大小选择

 

响应时间优先的应用:尽可能设置大,直到接近系统的最低响应时间限制 

在此种情况下,年轻代收集发生的频率也是最小的。同时,较少到达年老代对象。

 

吞吐量优先应用:尽可能的设置大,可能达到Gbit的程度,对响应时间没有要求

垃圾收集器可以并行进行,一般适合8CPU以上的应用。

 

 

年老代大小选择:

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等

参数。如设置小了,可能会造成碎片,高回收频率以及应用暂停而使用传统的标记清楚方式;如果堆大了,则需要较长的

收集时间,最优方案需要参考下面数值:

 1)并发垃圾收集信息 2)持久代并发收集次数 3)传统GC信息 4)花在年轻代和年老代回收上的时间比例减少年轻代和

 年老代花费时间,一般会提高应用效率。

 

 

吞吐量优先的应用

一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代,因为这可以尽可能

回收掉大部分短期对象,减少中期对象,而年老代尽量存放长期存活对象。

 

较小堆引起碎片:

-XX:UseCMSCoimpactAtFullCollection  并发收集器,开启年老代压缩 

-XX:CMSFullGCsBeforeCompaction=0  : 设置多少次Full GC后对年老代压缩

 

 

9 调优方法与工具

 

JVM调优工具: Jconsole ,jProfile ,VisualVM 

 

Jconsole:jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用,对垃圾回收算法

有很详细的跟踪

JProfiler: 商业软件,付费功能强大

VisualVM :JDK自带,功能强大,与JProfiler类似推荐使用。

 

10 内存泄露检查

 

内存泄露一般是资源使用完毕后无法回收,从而导致新资源请求分配无法回收。

 

当访问没量不大,但是对使用一直在增长,一般是内存泄露了

解决:GMap打印无法回收的对象。

 

 

堆栈溢出:StackOverflowError ,一般递归或者循环造成 

线程堆栈满:Stack size too small 

 

JVM内存优化:  http://blog.csdn.net/ppby2002/article/details/6096837

 

 
 -server -Xmx2g -Xms2g -Xmn512m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JVM系列之性能调优参考手册(实践篇).pdf

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...

    涨见识!JVM性能监控与调优实战 一线大厂大牛讲师的JVM优化案例与解决方案课程

    JVM性能监控与调优实战课程,作为整篇课程的重中之重,非常值得同学们参考学习。课程前端讲解了JVM的性能监控和调优的概述,对调优的的方法和工具进行讲解学习,让同学们掌握方法,理解知识。课程的中间阶段我们进行...

    jvm和gc详解及调优

    5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...

    个人总结之—JVM性能调优实战

    在实际应用开发与维护过程中,JVM性能调优是一个非常重要的话题,它直接关系到应用程序运行效率、资源利用以及用户体验等多方面因素。本总结旨在分享作者在实践中不断探索与总结的经验,为读者提供一份全面而实用的...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    《深入理解Java虚拟机》是一本深度探讨...通过学习JVM性能调优,我们可以优化应用程序的资源利用,提高运行效率;理解内存模型有助于编写线程安全的代码;而掌握虚拟机原理则让我们能够更好地驾驭这个复杂的运行环境。

    java -jvm 内存分配和jvm调优

    Java JVM(Java虚拟机)内存分配与调优是Java开发者必须掌握的重要技能,它涉及到程序的性能优化和稳定性。在Java应用中,JVM扮演着至关重要的角色,它负责解析字节码、管理内存以及执行线程等。本文将深入探讨JVM...

    JVM体系结构与GC调优

    通过深入学习JVM体系结构和GC调优,开发者可以更好地理解和控制Java应用的内存使用,减少垃圾收集的开销,提升系统性能。这份PPT将帮助我们系统地掌握这些关键点,使我们能够应对实际开发中的各种挑战。

    monkey老师的jvm 调优

    下面,我们就一起来深入学习Monkey老师关于JVM调优的核心知识点。 首先,我们要明白JVM的重要性。它是Java程序运行的基础,负责字节码的解释执行、内存管理以及性能优化等关键任务。理解JVM的工作机制,对于提高...

    JVM调优.pdf

    ### JVM调优详解 #### 一、JVM调优概述 在现代软件开发中,Java虚拟机(JVM)作为Java应用程序的运行环境,...通过本篇文章的学习,希望读者能够掌握JVM调优的基本原理和技术手段,为日常开发工作提供有力的支持。

    JVM性能调优经典教程

    JVM性能调优是一项关键技术,旨在优化JVM的内存管理、垃圾收集、类加载等方面,以提升程序运行速度、减少内存占用并避免系统崩溃。本教程"JVM性能调优经典教程"由马士兵老师倾力讲解,旨在帮助Java开发者进阶,掌握...

    java学习之JVM调优相关说明

    根据我们程序的实际需求对JVM进行规划和与调优配置 JVM的稳定性 调优原则 将机器的JVM参数设置到最优 一般的Java都不需要进行JVM优化 减少代码层面造成的GC问题(STW) 减少使用全局变量、大对象以及减少创建对象的...

    JVM的调优机制 初始入门

    相关的参考资料和工具对于学习JVM调优也有很大帮助,包括官方文档、专业社区、技术博客等。 JVM调优是一个复杂的过程,需要在实践中不断学习和积累经验。本文档提供了一个入门级的学习框架,可以帮助刚接触JVM的...

    jvm调优的实际应用

    针对这些问题,我们可以调整JVM的启动参数,如-Xms和-Xmx设置初始堆和最大堆大小,-XX:NewRatio设定新生代与老年代的比例,-XX:SurvivorRatio设定新生代中Eden与Survivor区的比例。 在实际应用中,我们常常使用一些...

    从0到1学习JVM如何调优

    从0到1学习JVM如何调优

    JVM调优总结.pdf

    在学习JVM调优的过程中,理解这些基础知识和概念是十分重要的。只有真正掌握了这些基本原理,才能在遇到性能瓶颈时,采取合适的优化措施,使应用运行更加高效和稳定。此外,作者还提醒我们要不断回顾和学习,通过...

    JVM性能调优

    ### JVM性能调优 #### JVM概念与发展历程 Java虚拟机(JVM)是Java Virtual Machine的简称,它是一种能够执行Java字节码的虚拟机。JVM的主要作用是在不同...在实践中不断学习和摸索,才能真正掌握JVM性能调优的精髓。

    JVM、GC详解及调优.pdf

    本文档详细讲解了JVM(Java Visual Mathine)的方方面面,首先由java的特性来描绘JVM的大致应用,再详细阐释了 JVM 的原理及内存管理机制和调优,讲述了与JVM密切相关的 Java GC 机制,最后对 JVM 调优进行了总结。...

    java高级篇:JVM调优.mp4

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

    第04章 大促高并发系统下JVM如何调优指导01.pdf

    其次,了解JVM内存溢出和死锁问题的定位与分析方法,以便快速定位问题并解决。另外,架构师还应该了解JVM调优的一些最佳实践,比如如何避免内存泄漏和过度的垃圾回收开销。 总结起来,高并发系统下的JVM调优涉及对...

Global site tag (gtag.js) - Google Analytics