`
eastzhang
  • 浏览: 10399 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转] JVM 精典配置

阅读更多
/opt/xx/java/bin/java -Dprogram.name=run.sh –server

-Xms4g           //指定 jvm 的最小 heap 大小

-Xmx4g           //指定 jvm 的最大 heap 大小

-Xmn2g

-Xss1m

-XX:PermSize=96m

-XX:MaxPermSize=256m

-XX:SurvivorRatio=10

-XX:+HeapDumpOnOutOfMemoryError    //

-XX:HeapDumpPath=/home/admin/logs/java.hprof -verbose:gc -Xloggc:/home/admin/logs/gc.log

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-XX:+UseConcMarkSweepGC

-XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80

-XX:+UseCompressedOops

-XX:+DisableExplicitGC

-Djava.awt.headless=true

-Dsun.net.client.defaultConnectTimeout=10000

-Dsun.net.client.defaultReadTimeout=30000

-Djava.net.preferIPv4Stack=true

-Djava.endorsed.dirs=/opt/xx/jboss/lib/endorsed

-classpath /opt/xx/jboss/bin/run.jar:/opt/xx/java/lib/tools.jar org.jboss.Main -b 0.0.0.0 -Djboss.server.home.dir=/home/admin/purdecision/.default -Djboss.server.home.url=file:/home/admin/purdecision/.default





这二年来这一堆东西我从来没有怀疑过,“绝对正确完美”,据说是 xx 的标配。以至于从来没有去分析了解过(一知半解),可能真的是惰性使然,也可能“忙”吧。无意中看到有人在博客里写到 “温故知新”,就像有人说读think in java一样每一回都有新的发现。下面就分析一下为什么要设置这些参数,有何意义。





上面参数说明:

-Xmx4g :

指定 jvm 的最大 heap 大小,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定



-Xms4g :

指定 jvm 的最小 heap 大小。些值设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存



-Xmn2g :

设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般

固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推

荐配置为整个堆的3/8。(按此说应设置为1.5G)

-Xss1m

每个线程堆栈大小为1M. 根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。(本机由于forest的原因-Xss2m,原因1:物理内存过小 2:window线程不能太多 猜的)



-XX:PermSize=96m

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或

者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新

增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置

-XX:PermSize=64MB 最小尺寸,初始分配
-XX:MaxPermSize=256MB 最大允许分配尺寸,按需分配
过小会导致:java.lang.OutOfMemoryError: PermGen space

MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m



(为什么不是64M 可能是webx设置的持久代空间比较多)





-XX:SurvivorRatio=10

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

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

这里设置为10也就是说一个Survivor区占整个年轻代的1/12,这个参数是否能小一点,毕竟我们的应用中没有创建很大的对像。





这个值设了有什么用?

上面配置中-Xmn2g 年轻代大小,SurvivorRatio为10时 :Eden超过1.66G时触发minor gc(young generation)

我的应用gc 日志一直在young gc 就是如此,看来我的应用 eden区还是设的很大的。




-XX:+HeapDumpOnOutOfMemoryError

参数表示当JVM发生OOM时,自动生成DUMP文件。



-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof。



-XX:+PrintGCDetails:

输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured:

112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]



-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用

输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]





-XX:+UseConcMarkSweepGC 

设置并发收集器



可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求

比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC打开。

并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对

象。在每个年老代垃圾回收周期中,在收集初期并发收集器 会对整个应用进行简短的暂停,在收集中还会再暂

停一次。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作。



CMS采用的基础算法是:标记—清除 所有CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片





-XX:CMSInitiatingOccupancyFraction=80



启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前有足够的内存空间供程

序使用,否则会出现“Concurrent Mode Failure”。通过设置-XX:CMSInitiatingOccupancyFraction=<N>

指定还有多少剩余堆时开始执行并发收集



-XX:+UseCMSCompactAtFullCollection:

打开对年老代的压缩。可能会影响性能,但是可以消除碎片



XX:+UseCompressedOops

通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。
对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。
幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数



-XX:-DisableExplicitGC

将会忽略手动调用GC的代码,如:System.gc(),将-DisableExplicitGC, 改成+DisableExplicitGC即为启用,默认为启用,什么也不写,默认是加号,但是系统内部默认的并不是什么都启用





至此为什么Xmx与xms 一样,为什么用CMS(并发收集器),为什么用了cms 要使用-XX:+UseCMSCompactAtFullCollection,为什么用XX:+UseCompressedOops等等,相信大家和我一样有所了解。不过对于有些还是不清楚理解有误,可能还要来来回回捣腾,不足之处请大家补充。

分享到:
评论
1 楼 eastzhang 2014-08-13  
-XX:+UseCompressedOops  普通对象指针压缩, 以节约 jvm 内存开销

相关推荐

    JVM内存配置优化

    #### 三、Tomcat中的JVM配置优化 对于使用Tomcat的应用,可以通过修改其配置文件来进行JVM的优化。以`catalina.sh`(Linux系统)或`catalina.bat`(Windows系统)为例,可以在文件中添加如下配置: ```sh JAVA_...

    tomcat6.0 修改启动内存设置 java jvm参数配置

    ### Tomcat 6.0 修改启动内存设置及 Java JVM 参数配置详解 #### 一、背景与目的 在部署和运行 Java Web 应用时,合理地配置应用服务器(如 Apache Tomcat)的内存是非常重要的。这不仅可以提升应用程序的性能,还...

    JVM 配置,JAVA环境配置

    ### JVM与JAVA环境配置详解 在进行JAVA应用开发时,正确配置JVM(Java虚拟机)及JAVA开发环境是至关重要的第一步。本文将基于提供的文件信息,深入解析JVM及JAVA开发环境配置的关键步骤和注意事项。 #### 1. JAVA_...

    JVM配置参数说明

    ### JVM配置参数详解 在Java虚拟机(JVM)的运行过程中,通过一系列的命令行参数,我们可以调整其性能和行为。以下是对JVM部分关键配置参数的详细解析,这些参数能够帮助我们优化应用程序的执行效率,管理内存,...

    jmx-jvm配置

    总的来说,JMX-JVM配置是一项强大的功能,它使得开发者和管理员能够实时监控和调整Java应用的运行状态,从而优化性能、诊断问题和实施细粒度的管理策略。正确配置和使用JMX对于提升Java应用的稳定性和效率至关重要。

    jvm 配置jvm参数

    ### JVM参数配置详解 #### 一、理解JVM参数配置的重要性 Java Virtual Machine (JVM) 是运行Java程序的核心环境,其性能优化很大程度上依赖于正确的JVM参数配置。合理配置JVM参数不仅可以显著提升应用程序的运行...

    简单实用JVM参数配置

    【JVM参数配置详解】 Java Virtual Machine (JVM) 是Java程序的核心组成部分,它负责解析和执行Java程序的字节码。JVM的设计目标是提供跨平台的运行环境,通过在实际硬件上模拟一个虚拟的计算机系统,使得Java程序...

    JVM内存参数详解以及配置调优

    JVM 内存参数详解以及配置调优 JVM 内存参数是 Java 虚拟机中最重要的参数之一,它直接影响着 Java 应用程序的性能和稳定性。在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、...

    jvm查询配置指令.txt

    jvm查询配置指令

    JVM配置资料JVM配置资料

    这份"JVM配置资料"包含的可能是一系列关于优化JVM性能、理解和调试JVM行为的重要信息。下面将详细讨论JVM配置中的关键知识点。 1. **JVM内存模型**: - **堆内存(Heap Memory)**:分为新生代(Young Generation...

    JVM参数配置及MyEclipse内存不足.rar

    下面我们将深入探讨JVM参数配置以及如何解决MyEclipse内存不足的问题。 1. JVM内存模型: JVM内存主要分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈...

    JVM调优实战(转)

    JVM调优实战 本文档旨在介绍JVM调优...本文档提供了JVM调优实战的详细介绍,包括JVM内存结构、垃圾回收机制、性能优化策略和JVM参数配置等方面的知识点。通过对这些知识点的掌握,读者可以更好地理解和优化JVM的性能。

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

    总结起来,深入理解JVM内核,熟练掌握诊断技巧,并合理调整JVM配置参数,是每一个Java开发者必备的技能。通过本教程的学习,你将能够运用这些知识有效地提升应用性能,解决实际工作中的各种挑战。

    jdk8 jvm 参数图(随手参考好资料)

    常用jvm参数都在这张图中,参考起来方便,是国外大神整理的

    jvm优化参数配置

    "jvm优化参数配置"是确保Tomcat稳定运行的关键环节,能够提高应用的响应速度,减少内存泄露,提升系统整体性能。以下是对JVM参数优化的详细解释: 1. **内存配置**: - **堆内存(Heap Memory)**:分为新生代...

    常用JVM配置参数.ppt

    ### 常用JVM配置参数详解 #### 一、概述 Java虚拟机(JVM)是运行Java程序的核心环境,其性能的优劣直接影响到Java应用程序的执行效率。为了更好地控制JVM的行为并进行调优,熟悉JVM的配置参数至关重要。本文将深入...

    JBOSS\Tomcat最大连接数配置和jvm内存配置.docx

    【JBOSSTomcat最大连接数配置和JVM内存配置】 在JBOSSTomcat服务器的性能优化中,最大连接数配置和JVM内存配置是两个至关重要的环节,它们直接影响到服务器的响应速度和稳定性,尤其对于处理大量并发请求的场景。 ...

Global site tag (gtag.js) - Google Analytics