`

JVM

 
阅读更多
从JRE1.3开始, GC都采用了分代复制算法,这个算法根据对象的生存期将对象分成两代,新创建的对象在年轻代(Young Generation),当年轻代的内存分完的时候,GC将年轻代中少数尚未死亡的对象复制到另一块年老代(Tenured Generation),然后直接更新年轻代的指针,这个动作称为次要收集(minor collection),一次次要收集的时间取决于年轻代中存活的对象的数目,当年轻代中的对象绝大部分已经死亡的话,次要收集速度很快。当年老代的内存分完的时候,GC会进行一次主要收集(major collection),因为采用了标记收集, 这个动作很慢。所以我们Tuning的策略基本上来说就是尽量减少主要收集的次数。   Tuning的目的是提高性能,但性能指标是有很多种的, 不同的情况下对不同的指标有不同的要求. 因此,在开始Tuning之前,我们要先弄清楚究竟是要提高哪些指标,而不仅仅是一个模糊的概念-“提高性能”.吞吐量(Throughput)是指没用在GC上的时间比例,中断(Pause)是当GC时,程序没有响应的时间。这是衡量GC性能的两个主要指标,不同的应用对于这两个指标要求是不一样的,所以调优的策略也就不一样。此外还有其它指标,Footprint,影响着可伸缩性(scalability),灵敏度(Promptness),指从一个对象死亡到它占据的内存可用的时间间隔。通常来说,吞吐量跟年轻代的大小成正比,其它指标跟年轻代成反比。一般情况下,一个generation的大小不会影响到另外一个generation的收集频率和中断时间.
JVM的堆空间分成年轻代(Young Gen)、年老代(Old Gen)和持久代(Perm Gen),其中年轻代用于放置新创建的对象,而对象在经过几次的垃圾回收后仍然没有被回收,则将其转移到年老代,持久代用于放置一些为JVM本身的方便性而使用的对象,譬如类定义、方法定义、常量、代码段等。年轻代又分为一个Eden区和两个Survivor区, 而总有一个Survivor区是空的,随着每一次的垃圾回收,从Eden区和非空Survivor区的存活对象拷贝到空Survior区,如果Survior空间不足,则直接拷贝到年老区中,并将刚经历过回收的区空间返回到堆空间,此时两个Survivor的角色做了个转换(空的变成非空,非空的变成空的)。当一个对象经过多次回收仍然存在,则将其转入年老区。Sun HotSpot JVM对不同代将使用不同的垃圾回收算法。。

综合配置:

export CATALINA_OPTS="-Djava.awt.headless=true -server -Xms2357M -Xmx2357M -Xmn1843M -Xss128k -XX:PermSize=330M -XX:MaxPermSize=330M  -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -Xloggc:/home/sunwei/gc.log"

export CATALINA_OPTS="-Djava.awt.headless=true
-server
-Xms2048M -Xmx2048M(-Xmx3000m)
-Xmn1024M(-Xmn2g)
-Xss128k
-XX:PermSize=256M -XX:MaxPermSize=256M
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=7
-XX:GCTimeRatio=19
-XX:+UseParNewGC
-XX:ParallelGCThreads=4
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:-CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=70
-XX:SoftRefLRUPolicyMSPerMB=0
-Xnoclassgc
-XX:+DisableExplicitGC

-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintHeapAtGC
-Xloggc:/home/sunwei/gc.log"


Djava.awt.headless=true
Linux下默认不按装X window,这样可以用applet画图


-server
启用能够执行优化的编译器, 显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。

-Xms2048M -Xmx2048M
为了不消耗扩大heap的开销,将这个两个值设为相等,考虑到需要开线程,讲此值设置为总内存的80%,比如4g机器,那么此值为4g*0.8=3276M

-Xmn1024M
一般设置为堆的1/4 比如 4g*0.8*3/8=1228M,此值不应该设置的太小,正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。此参数的缺省设置通常过低,这将导致执行大量的小型垃圾回收操作。如果将此参数设置得过高,可能会导致 JVM 仅执行大型(全面)垃圾回收。这些垃圾回收操作通常会耗时几秒钟,这将严重影响服务器的整体性能。您必须保持将此参数设置为小于整个堆大小的一半,以避免这种情况出现

-Xss128k
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。


-XX:PermSize=256M -XX:MaxPermSize=256M
设置持久代初始大小和总大小,这两个值也和xms、xmx一样要设置成一样大。这里放class和meta等,一般设置为堆的1/8 ,也就是 4g*0.8*1/8=

-XX:SurvivorRatio=8
这样perm=8/10的yang区
将 Java 堆划分为旧对象(长生命周期对象)区域和新对象区域。新对象区域进一步细分为两部分,第一部分用于分配给新对象(初始区域),第二部分存放那些经过其前几次垃圾回收之后、但在被提升为旧对象之前仍在使用中的新对象(幸存者空间)。幸存者比率是堆的新对象区域中初始区域与幸存者空间的比率。增大此设置将针对需要创建大量对象但仅保留少量对象的应用程序优化 JVM。与其他应用程序相比,WebSphere Application Server 会生成更多中等生命周期对象和长生命周期对象,因此,应该将此设置设置为小于缺省值(32)。


-XX:MaxTenuringThreshold=7
一个对象如果在救助空间移动7次还没有被回收就放入年老代,
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
-XX:GCTimeRatio=19
即为吞吐量,设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
可以提高GC说占CPU的比,以最大话的减小heap
吞吐量为垃圾回收时间与非垃圾回收时间的比值,默认值为99%




-XX:+UseParNewGC
可用来设置年轻代为并发收集【多CPU】,因为我们强调并发量,下面这个强调吞吐量

+UseParallelGC
选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集

-XX:ParallelGCThreads=4
年轻代并行垃圾收集的前提下(对并发也有效果)的线程数,增加并行度,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

-XX:+UseConcMarkSweepGC
设置年老代为并发收集。-XX:NewRatio=4的配置会失效
Concurrent Collector是为了追求最小pause而设计的。


-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
由于使用的框架是Spring/Hibernate大量采用cglib,导致生成的Proxy会比较多,而这些是存放在PermGen区域,sun JDK默认情况下不会去回收,必须加上-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled参数,JDK才会去回收这部分数据


-XX:+UseCMSCompactAtFullCollection
打开对年老代的压缩。可能会影响性能,但是可以消除碎片(老年代才会有full gc)

-XX:CMSFullGCsBeforeCompaction=0
-XX:+UseCMSCompactAtFullCollection配置开启的情况下,设置多少次Full GC后,对年老代进行压缩

-XX:-CMSParallelRemarkEnabled
If the -XX:+UseParNewGC option is in use the remark pauses may be decreased with the -XX:+CMSParallelRemarkEnabled option.

-XX:CMSInitiatingOccupancyFraction=70
表示年老代占到约70%时就开始执行内存压缩

-XX:SoftRefLRUPolicyMSPerMB=0
softly reachable objects to remain alive for 0s per free mb

-Xnoclassgc
缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

-XX:+DisableExplicitGC
System.gc()不好,full-gc浪费巨大,gc的时机把握不一定对等等,用这个参数 来禁止它
分享到:
评论

相关推荐

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

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

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

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...

    SAP JVM 8.1 64 bits

    SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...

    JVM中文指令手册.pdf

    JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    在Java开发领域,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、...

    JVM必知必会

    ### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: - **一套规范**:即Java虚拟机规范,定义了Java虚拟机应该具有的行为。 - **一种实现**:例如HotSpot、J9、JRockit,它们都是...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    R大(国内JVM权威)资料合集

    R大作为国内JVM领域的权威专家,分享了一系列与JVM相关的知识点,涉及高级语言虚拟机的基础概念、重要书籍推荐、编译器设计与优化等多个方面。这些内容不仅对初学者友好,也为专业人士提供了深入理解JVM机制的机会。...

    jvm crash的崩溃日志详细分析及注意点

    JVM(Java Virtual Machine)是Java程序运行的核心组件,它负责解释和执行字节码。然而,当JVM出现严重错误或无法恢复的问题时,它可能会崩溃并生成一个崩溃日志,这通常被称为`hs_err_pid.log`文件。这篇内容将深入...

    jvm指令手册 +JVM必知必会,掌握虚拟机编译过程.rar

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台...

    idea插件JVM内存工具JProfiler11

    5. **JVM配置调整**:JProfiler11还可以提供JVM参数建议,帮助开发者正确设置JVM初始堆大小、最大堆大小、内存池等关键参数,确保应用程序稳定运行。 在实际使用中,JProfiler11的详细报告和可视化界面使得问题定位...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    SAP JVM 4.1 64 bits

    SAP JVM 4.1 64位是一个专为SAP系统设计的Java虚拟机,它主要用于运行SAP的应用程序和服务。此版本是为64位操作系统优化的,旨在提供更好的性能和内存管理能力,特别是在处理大数据量和复杂计算场景时。 首先,我们...

    马士兵jvm调优笔记.docx

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

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    ### Java虚拟机(JVM)内存设置与调优详解 #### 引言 在现代软件开发中,Java虚拟机(JVM)作为执行Java字节码的核心组件,其性能直接影响到Java应用的运行效率与稳定性。特别是在大数据处理场景下,合理设置JVM内存...

Global site tag (gtag.js) - Google Analytics