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

jvm 调优

阅读更多

转自 http://blog.csdn.net/jiangguilong2000/article/details/14606685

 

最近开始优化页游服务端的性能,一些心得总结一下。现在的服务器硬件越来越好,几十G内存,十几个CPU。当硬件不是瓶颈的时候,如果让程序发挥最大效用就成了我们需要考虑的问题。就游戏服务器来说,得满足几个要求,高负载,低延时。特别是在开服当天,大量用户会涌进来,可能给服务器造成压力。使用Java作为服务器语言,除了程序本身的性能外,JVM的配置也直接影响到系统性能。

参数调优

  1. 入门级别的配置一般是:java -server -Xmx5000m Xms5000m

    服务器端的jvm运行程序记得都最好加上 -server 很多默认参数都会根据这个运行模式来优化。这里设置了最大内存和最小内存,一般都是配置成相同的,可以减少内存申请和伸缩带来的性能损耗

  2. 加入垃圾回收算法的配置:java -server -Xmx5000m -Xms5000m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

    关于垃圾回收的具体算法介绍我这里就不详细描述了,我们都有一个常识,就是尽量减少JVM的full gc的次数和时间,因为full gc 会导致整个系统的暂停(stop the world).为此,我们为老年代选择了UseConcMarkSweepGC 选择了并发gc算法,也为新生代选择了多线程的并行gc算法UseParNewGC。

  3. 设置新生代的内存大小 java -server -Xmx5000m -Xms5000m -Xmn800m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

    Xmn是新生代的内存大小,包括(eden+ 2 survivor space)。这个参数设置直接影响系统的响应速度。在java程序中new一个对象,首先是放在eden区域,eden满了后,触发gc,存活下来的对象被拷贝到survivor区。经过若干次yong gc后,如果依然存活下来,就会进入老年代。新生代设置大了,会导致一次yong gc的时间消耗大,设置小了,又会很快满了,导致yong gc的频率过高。新生代不宜设置过大,因为新生代大了,老年代的内存就小了,老年代内存小,会导致full gc发生的频率变大。Xmn也没有一个确切的算法,根据你自身的业务系统决定的。我在设置的游戏服务器的时候,一般采用模拟大量并发用户的行为,调整Xmn的大小,同时监控gc的时间和频率,选择一个合适的大小。下面我会提到怎么用工具来监控gc。

  4. 设置一些额外的高级参数 java -server -Xmx5000m -Xms5000m -Xmn800m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70

    使用CMS进行老年代gc,会容易导致一些内存碎片,导致内存利用率降低,为此,加入 UseCMSCompactAtFullCollection 可以保证在full gc时进行内存压缩,减少内存碎片,系统默认为开启true。CMSInitiatingOccupancyFraction=70 表示老年代内存达到70%时触发。这个参数要特别小心,默认为68%,设置得过小会导致full gc没有完成,yong gc的对象迁移过来,导致整个老年代内存都满了

    5.-XX:+UseCompressedOops JVM优化之压缩普通对象指针(CompressedOops),通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。系统默认为开启true。

    6.-XX:+PrintCommandLineFlags 。这个参数的作用是显示出VM初始化完毕后所有跟最初的默认值不同的参数及它们的值。 

    7. -XX:+PrintFlagsFinal 。前一个参数只显示跟默认值不同的,而这个参数则可以显示所有可设置的参数及它们的值。

    8.-XX:+PrintFlagsInitial 。这个参数显示在处理参数之前所有可设置的参数及它们的值

     

    1. <span style="font-family:Microsoft YaHei">$ java -version  
    2. java version "1.6.0_29"  
    3. Java(TM) SE Runtime Environment (build 1.6.0_29-b11)  
    4. Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)  
    5. $ java -XX:+PrintFlagsInitial | grep UseCompressedOops  
    6.      bool UseCompressedOops                         = false           {lp64_product}        
    7. $ java -XX:+PrintFlagsFinal | grep UseCompressedOops  
    8.      bool UseCompressedOops                        := true            {lp64_product}      </span>  

    JVM默认垃圾回收策略,
  5. 针对年轻代:
  6. UseParallelGC true(默认)
  7. UseParNewGC false
    UseSerialGC false
    -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。可以同时并行多个垃圾收集线程,但此时用户线程必须停止。
    -XX:+UseParNewGC:设置年轻代为多线程收集。可与CMS收集同时使用。在serial基础上实现的多线程收集器。
    1. 针对年老代:
    UseParallelOldGC true(默认)
    UseConcMarkSweepGC false
    -XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
    -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。当-XX:-UseParallelGC启用时该项自动启用 

     

工具

  • jstat 用来实时查看gc的状态,

    用法:jstat -gcutil 进程号 时间(毫秒)。结果如下:

    里面列出每个区间的内存大小,新生代gc的次数和时间,老年代gc的次数和时间。这里都能反映出你的JVM的运行状况

  • jmap 用于查看java进程的对象状况

    用法:jmap -histo:live 进程id 。可以打印每个类的实例数量,内存大小

    用法:jmap -dump:format=b,file=log.bin 进程id 这个命令特别有用,可以将jvm的整个内存镜像拷贝下来,用于分析每个对象占用的内存状况。当你的java进程崩溃了,用这个方法,可以分析出哪些对象是罪魁祸首

  • jstack 用于查看java进程id的堆栈信息

    用法:jstack 进程id 这个工具对于查看死循环的线程很有效,可以直接找出是哪个线程在哪个方法内死循环了

总结

JVM的参数有很多,大部分我们都不需要去设置和优化。如果你的程序没有问题,就不要去折腾。如果你要优化,一定要有相应的测试流程来支撑。

分享到:
评论

相关推荐

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

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

    马士兵jvm调优笔记.docx

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

    JVM调优.pdf

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

    JVM调优工具命令详解.pdf

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

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

    在JVM调优实践中,了解各个运行时数据区的工作原理至关重要。以下是对这些区域的详细解析: 1. **虚拟机栈**:每个线程都有一个独立的虚拟机栈,用于存储方法调用时的栈帧。栈帧中包含局部变量表(存储方法中的变量...

    monkey老师的jvm 调优

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

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

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

    jvm调优的实际应用

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

    JVM调优总结PDF,带原理图

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

    马老师jvm调优实战笔记

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

    JVM调优总结.pdf

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

    JVM调优实战(转)

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

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

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

    深入虚拟机---JVM调优总结(摘自网上网上大牛分享).pdf

    在深入讨论JVM(Java虚拟机)调优之前,我们有必要先了解一下虚拟机的基本概念和堆栈...通过上述的分析和总结,我们可以得出,JVM调优是一个涉及多方面知识的复杂过程,需要开发者具备扎实的理论基础和丰富的实践经验。

    jvm调优实战经验

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

    java高级篇:JVM调优.mp4

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

    JVM调优攻略.pdf

    ### JVM调优攻略 #### 一、概述 《JVM调优攻略》是一份详尽的文档,旨在帮助开发者理解并掌握Java虚拟机(JVM)的优化技巧。本指南不仅适用于初学者,对于有一定基础的开发人员来说也同样具有很高的参考价值。文档中...

    JVM调优实战.doc

    《JVM调优实战》是一份深入探讨Java虚拟机(JVM)性能优化的文档,主要分为理论篇和实战篇两大部分。本文将详细解析其中的关键知识点。 理论篇首先介绍了JVM内存模型,将其比喻为一个多功能的养鱼塘。在这个比喻中...

Global site tag (gtag.js) - Google Analytics