`
cenwenchu
  • 浏览: 165464 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
 
JVM优化配置
       这里首先要说明的是这里提到的JVM是Sun的HotSpot JVM 5和以上的版本。性能优化在应用方面可以有很多手段,包括Cache,多线程,各种算法等等。通常情况下是不建议在没有任何统计和分析的情况下去手动配置JVM的参数来调整性能,因为在JVM 5以上已经作了根据机器和OS的情况自动配置合适参数的算法,基本能够满足大部分的情况,当然这种自动适配只是一种通用的方式,如果说真的要达到最优,那么还是需要根据实际的使用情况来手动的配置各种参数设置,提高性能。
       JVM能够对性能产生影响的最大部分就是对于内存的管理。从jdk 1.5以后内存管理和分配有了很多的改善和提高。
内存分配以及管理的几个基本概念和参数说明:
Java Hotspot Mode:
server 和 client两种模式,如果不配置,JVM会根据应用服务器硬件配置自动选择模式,server模式启动比较慢,但是运行期速度得到了优化,client启动比较快,但是运行期响应没有server模式的优化,适合于个人PC的服务开发和测试。
 
Garbage Collector Policy:
       在Jdk 1.5的时候已经提供了三种GC,除了原来提供的串行GC(SerialGC)以外,还提供了两种新的GC:ParallelGC和ConcMarkSweepGC。ParallelGC采用了多线程并行管理和回收垃圾对象,提高了回收效率,提高了服务器的吞吐量,适合于多处理器的服务器。ConcMarkSweepGC采用的是并发方式来管理和回收垃圾对象,降低垃圾回收产生的响应暂停时间。这里说一下并发和并行的区别,并发指的是多个进程并行执行垃圾回收,那么可以很好的利用多处理器,而并行指的是应用程序不需要暂停可以和垃圾回收线程并发工作。串行GC适合小型应用和单处理器系统(无需多线程交互,效率比较高),后两者适合大型系统。
       使用方式就是在参数配置中增加-XX:+UseParallelGC等方式来设置。
       对于这部分的配置在网上有很多的实例可以参考,不过最终采用哪一种GC还是要根据具体的情况来分析和选择。
 
Heap:
       OOM的各种经历已经让每一个架构师开发人员看到了了解Heap的重要性。OOM已经是Heap的临界点,不得不引起注意,然而Heap对于性能的潜在影响并未被引起重视,不过和GC配置一样,在没有对使用情况作仔细分析和研究的情况下,贸然的去修改Heap配置,可能适得其反,这里就来看一下Heap的一些概念和对于性能的影响。
       我们的应用所能够得到的最大的Heap受三部分因素的制约:数据处理模型(32位或者64位操作系统),系统地虚拟内存总数和系统的物理内存总数。首先Heap的大小不能超过不同操作系统的进程寻址范围,当前大部分系统最高限度是4G,Windows通常是2G,Linux通常是3G。系统的虚拟内存也是分配的依据,首先是不能超过,然后由于操作系统支持硬盘来做部分的虚拟内存,如果设置过大,那么对于应用响应来说势必有影响。再则就是要考虑同一台服务器上运行多个Java虚拟机所消耗的资源总合也不能超过可用资源。就和前面OOM分析中的一样,其实由于OS的数据处理模型的限制,机器本身的硬件内存资源和虚拟内存资源并不一定会匹配,那么在有限的资源下如何调整好资源分配,对于应用来说尤为重要。
 
 
关于Heap的几个参数设置:
       说了Heap的有限资源问题以后,就来看看如何通过配置去改变JVM对于Heap的分配。下面所说的主要是对于Java Heap的分配,那么在申请了Java Heap以后,剩下的可用资源就会被使用到Native Heap。
       Xms: java heap初始化时的大小。默认情况是机器物理内存的1/64。这个主要是根据应用启动时消耗的资源决定,分配少了申请起来会降低启动速度,分配多了也浪费。
       Xmx:java heap的最大值,默认是机器物理内存的1/4,最大也就到1G。这个值决定了最多可用的Java Heap Memory,分配过少就会在应用需要大量内存作缓存或者零时对象时出现OOM的问题,如果分配过大,那么就会产生上文提到的第二类OOM。所以如何配置还是根据运行过程中的分析和计算来确定,如果不能确定还是采用默认的配置。
       Xmn:java heap新生代的空间大小。在GC模型中,根据对象的生命周期的长短,产生了内存分代的设计:青年代(内部也分成三部分,类似于整体划分的作用,可以通过配置来设置比例),老年代,持久代。每一代的管理和回收策略都不相同,最为活跃的就是青年代,同时这部分的内存分配和管理效率也是最高。通常情况下,对于内存的申请优先在新生代中申请,当内存不够时会整理新生代,当整理以后还是不能满足申请的内存,就会向老年代移动一些生命周期较长的对象。这种整理和移动会消耗资源,同时降低系统运行响应能力,因此如果青年代设置的过小,就会频繁的整理和移动,对性能造成影响。那是否把年青代设置的越大越好,其实不然,年青代采用的是复制搜集算法,这种算法必须停止所有应用程序线程,服务器线程切换时间就会成为应用响应的瓶颈(当然永远不用收集那么就不存在这个问题)。老年代采用的是串行标记收集的方式,并发收集可以减少对于应用的影响。
       Xss:线程堆栈最大值。允许更多的虚拟内存空间地址被Java Heap使用。
 
以下是sun公司的性能优化白皮书中提到的几个例子:
 
1.对于吞吐量的调优。机器配置:4G的内存,32个线程并发能力。
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
       -Xmx3800m -Xms3800m 配置了最大Java Heap来充分利用系统内存。
       -Xmn2g 创建足够大的青年代(可以并行被回收)充分利用系统内存,防止将短期对象复制到老年代。
    -Xss128 减少默认最大的线程栈大小,提供更多的处理虚拟内存地址空间被进程使用。
    -XX:+UseParallelGC 采用并行垃圾收集器对年青代的内存进行收集,提高效率。
    -XX:ParallelGCThreads=20 减少垃圾收集线程,默认是和服务器可支持的线程最大并发数相同,往往不需要配置到最大值。
 
2.尝试采用对老年代并行收集
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-Xmx3550m -Xms3550m 内存分配被减小,因为ParallelOldGC会增加对于Native Heap的需求,因此需要减小Java Heap来满足需求。
-XX:+UseParallelOldGC 采用对于老年代并发收集的策略,可以提高收集效率。
 
3.提高吞吐量,减少应用停顿时间
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31
 
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC 选择了并发标记交换收集器,它可以并发执行收集操作,降低应用停止时间,同时它也是并行处理模式,可以有效地利用多处理器的系统的多进程处理。
 
-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=31 表示在青年代中Eden和Survivor比例,设置增加了Survivor的大小,越大的survivor空间可以允许短期对象尽量在年青代消亡。
 
-XX:TargetSurvivorRatio=90 允许90%的空间被占用,超过默认的50%,提高对于survivor的使用率。
 
类似的例子网上很多,这儿就不在列下来了,最终是否采取自己配置来替换默认配置还是要根据虚拟机的使用情况来分析和配置。
 
分享到:
评论

相关推荐

    JVM优化与OOM分析PPT

    ### JVM优化与OOM分析 #### 一、JVM的重要性与作用 JVM(Java Virtual Machine)作为Java程序的运行环境,对于确保Java程序能够跨平台运行具有重要意义。它不仅提供了执行字节码的基础,还负责内存管理、垃圾回收...

    JVM优化方案

    在JVM优化中,内存配置是关键的一环。例如,`-Xms2048m -Xmx2048m`设置了JVM的最小和最大堆内存为2GB,`-Xmn512m`指定了新生代的大小为512MB,`-XX:MaxPermSize=256m`设定了永久代的最大值为256MB,而`-Xss128k`则...

    jvm -spark-优化

    通过以上介绍可以看出,JVM与Spark之间存在着紧密的联系,通过对JVM的深入理解和优化,可以极大地提升Spark应用的性能。希望本文能为你提供有价值的参考和指导,帮助你在实际工作中更好地应对大数据挑战。

    用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

    `JVMTest-master`可能包含这样的示例程序,通过控制JVM参数(如`-Xms`、`-Xmx`、`-XX:NewRatio`、`-XX:MaxMetaspaceSize`等)来模拟不同内存配置,观察何时会出现`OOM`。 JVM调优主要包括以下几个方面: 1. **内存...

    jvm paper jvm

    Java虚拟机(JVM)是Java程序运行的核心组件,它为开发者提供了跨平台的执行环境。JVM通过解析字节码(Bytecode)来...同时,通过合理的参数配置和优化技巧,可以有效避免和解决内存溢出等问题,确保程序的稳定运行。

    Java虚拟机_JVM_参数配置

    JVM参数配置是优化Java应用程序性能的关键环节,通过调整这些参数,我们可以控制JVM的行为,包括内存分配、垃圾收集、类加载等方面。在本文中,我们将深入探讨Java虚拟机的参数配置及其对程序性能的影响。 首先,...

    JVM常用参数设置

    理解并正确配置JVM参数对于优化应用程序性能、内存管理和故障排查至关重要。本文将深入探讨JVM的常用参数设置,以及它们如何影响Java应用程序的运行。 一、JVM内存设置 1. **堆内存**: - `-Xms`:初始堆大小,...

    对JVM调优的总结经验.docx

    2. 优化运行 JVM 运行环境:包括优化 JVM 的配置、垃圾回收机制、类加载机制等。 3. 解决 JVM 运行过程中出现的各种问题:包括解决 OOM 问题、死锁问题、卡顿问题等。 Linux 命令 在 JVM 调优过程中,需要使用一些...

    JVM内存分析工具.7z

    jca457工具可以帮助开发者检查当前的JVM配置是否合理,提供优化建议,以确保JVM在最佳状态下运行。 这些工具的使用方法通常包括以下步骤: 1. **捕获堆转储(Heap Dump)**:当JVM出现OOM时,或者需要定期检查时,...

    jvm工具、参数调优&调试技巧(补充+修正版)

    6. -XX:+PrintFlagsFinal:查看所有默认和已设置的JVM参数值,便于了解当前配置。 三、调试技巧 1. 使用-XX:+HeapDumpOnOutOfMemoryError参数,当发生OOM时自动生成堆转储文件,以便分析内存泄漏。 2. 异常日志...

    jvm 调优建议文档

    - **常见OOM分析**:OOM (Out Of Memory) 是常见的内存问题之一,通过分析堆转储文件和GC日志,可以定位问题原因。 - **dump分析工具**:如JProfilere、Eclipse Memory Analyzer等工具可以帮助开发者分析堆转储文件...

    JVM成神之路笔记整理版

    8. **JVM内存溢出与异常**:学习如何识别和处理常见的JVM错误,如OOM(Out Of Memory)错误,以及如何通过调整JVM配置避免这些问题。 9. **JDK和JRE**:JDK包含JRE和开发工具,如编译器javac和调试器jdb。JRE则包含...

    JVM垃圾回收,参数,强软弱虚,常见错误OOM,与微服务结合.docx

    "JVM垃圾回收、参数、强软弱虚、常见错误OOM、与微服务结合" JVM垃圾回收是Java虚拟机(JVM)中的一种机制,用于自动回收无效对象所占用的内存...要解决该错误,需要调整 JVM 参数、优化代码和使用合适的垃圾收集器。

    OOM小例子,用于验证oom出现以及对应的问题排查

    4. **合理设置JVM参数**:根据应用需求和服务器资源,合理配置JVM内存大小和GC策略。 5. **监控和报警**:建立内存使用监控机制,当达到预设阈值时发送报警,提前发现问题。 通过上述分析,我们可以了解到,理解并...

    jvm参数调优-jvm.zip

    JVM参数调优是提升Java应用程序性能的关键环节,尤其是在高并发、大数据量的环境中,合适的JVM配置可以显著改善系统的响应速度和稳定性。 在进行JVM调优时,我们主要关注以下几个核心方面: 1. **内存设置**:JVM...

    Tomcat JVM内存设置方法

    #### 二、理解JVM内存模型 在深入探讨如何设置Tomcat的JVM内存之前,我们需要先了解JVM内存的基本结构。JVM内存主要分为以下几个部分: 1. **堆内存(Heap Memory)**:这是JVM管理的主要内存区域之一,用于存储...

    JVM性能调优分析过程

    7. **异常处理与日志**:配置当出现OOM(Out Of Memory)时生成内存dump文件和GC日志,便于后期分析问题原因。 通过上述方法,我们可以构建出一个更适应业务需求的JVM运行模型,优化内存利用率,降低GC频率,提高...

    JVM 参数调优-optimization-jvm.zip

    了解每个区域的作用和配置参数是调优的基础。 2. **堆内存调优**:堆内存主要用来存放对象实例,分为新生代(Young Generation)和老年代(Old Generation)。新生代又分为Eden区和两个Survivor区。关注`-Xms`和`-...

    分享:JVM及其性能调优,欢迎交流

    在实际应用中,根据应用的特性和运行状况,需要不断调整和优化JVM的参数,以达到最佳的性能表现。例如,对于CPU占用过高的问题,可能需要检查是否存在过多的垃圾回收或线程阻塞;对于内存增长过快,可能需要分析对象...

Global site tag (gtag.js) - Google Analytics