一、JVM调优基本流程
1、划分应用程序的系统需求优先级
2、选择JVM部署模式:单JVM、多JVM
3、选择JVM运行模式
4、调优应用程序内存使用
5、调优应用程序延迟
6、调优应用程序吞吐量


二、选择JVM部署模式:单JVM、多JVM
1、单JVM
优点:不需要管理多个JVM,降低管理成本; 应用程序消耗内存数量较少
缺点:存在单点故障,一个JVM失效时,整个系统失效。
2、多JVM
优点:更好的可用性,避免单点故障;更低延迟,因为垃圾收集所产生的停顿是程序延迟的主要原因,多JVM减少了每次Full GC所需的时间。
缺点:监控、管理困难,且消耗较多的内存数量。

三、选择JVM运行模式:
1、client与server模式
-client:把应用当成客户端类程序进行优化。该选项应该在应用启动时使用,对这类应用程序而言,内存占用是最重要的性能标准,远比高吞吐量重要。
-server:把应用当成服务器类程序进行优化。适用于高吞吐量比启动时间和内存占用更重要的应用程序。
目前还有一个较新的选项:
-server -XX:TieredCompilation:结合了二者的优点,可以考虑代替-client。

2、-32与-64
使用32位JVM还是64位JVM由应用程序使用的内存来决定,基本原则如下:
0~2G:32位
2G~32G:使用-d64 -XX:+UserCompressedOops
32G以上:64位
事实上,在Java6 Update18之后,JVM根据堆大小自动启用-XX:+UserCompressedOops,因此配置时2G以内使用-32,2G以上使用-64即可。

3、选择垃圾收集器
一般情况下,使用默认的Throughput收集器即可。

四、确定内存占用
1、垃圾收集基础
(1)三个性能属性(内存占用、延迟、吞吐量)中任何一个属性性能的提高几乎都是以另一个或者2个属性的性能损失作为代价的。
(2)在程序运行中开启垃圾收集器日志可以收集GC的大量信息,从而为调优作好数据准备,以下命令用于开启GC日志:
java -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./test.log SignalGenerator
详细分析请见《JAVA性能优化权威指南》P194.

2、JAVA程序的内存布局
正如其它一切应用,JAVA在内存中的占用主要分为堆和栈2种,其中堆用于保存程序运行中的各种对象,栈用于保存程序的方法调用、线程调用等。
(1)栈:线程越多,方法调用层次越深,栈占用的内存就越大。
(2)堆:JVM中的堆分为三部分:新生代、老生代、永久代。

3、关于新生代、老生代、永久代。
(1)Java应用程序分配Java对象时,首先在新生代空间中分配对象。存活下来的对象,即经过几次Full GC之后还保持活跃的对象会被提升进入老生代空间。永久代空间中存放VM和Java类的元数据,以及驻留的Strings和类静态变量。
(2)新生代与老生代共用Java堆空间,永久代单独使用空间。

4、堆空间配置选项:
(1)-Xms:初始堆大小   -Xmx:最大堆大小
  • 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
  • 上面指定的空间大小为新老生代所共用,默认情况下JVM可以根据应用程序的需要动态的扩展或者收缩。
  • 关注吞吐量及延迟的应用程序应该将-Xms与-Xmx设定为同一值。这是因为无论扩展还是收缩新生代或者老生代空间都要进行Full GC。
(2)-XX:NewSize=<n>[g|m|k]   -XX:MaxNewSize=<n>[g|m|k]  -Xmn<n>[g|m|k]
分别设置新生代的默认空间大小、最大空间大小,以及若二者相等时使用-Xmn代替。
老生代不需要单独设置,用堆大小减去新生代大小即是老生代的大小

(3)-XX:PermSize=<n>[g|m|k]  -XX:MaxPermSize=<n>[g|m|k]
用于设置永久代的空间大小。

5、计算活跃数据大小
活跃数据是指应用程序处于稳定态(多次执行Full GC以后),Full GC之后Java堆中老年代和永久代所占用的空间大小。

6、Java堆大小计算法则
java堆 -Xms -Xmx 3~4倍Full GC后的老年代空间大小
永久代 -XX:PermSize -XX:MaxPermSize 1.2~1.5倍Full GC后的永久代空间大小
新生代 -Xmn 1~1.5倍Full GC后的老年代空间大小
老生代 java堆大小减去新生代大小 2~3倍Full GC后的老年代空间大小

JVM调优基础的更多相关文章

  1. JVM调优基础 分类: B1_JAVA 2015-03-14 09:33 250人阅读 评论(0) 收藏

    一.JVM调优基本流程 1.划分应用程序的系统需求优先级 2.选择JVM部署模式:单JVM.多JVM 3.选择JVM运行模式 4.调优应用程序内存使用 5.调优应用程序延迟 6.调优应用程序吞吐量 二 ...

  2. JVM调优基础到进阶

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...

  3. [转] JVM 调优系列 & 高并发Java系列

    1.JVM调优总结(1):一些概念:http://www.importnew.com/18694.html 2.JVM调优总结(2):基本垃圾回收算法:http://www.importnew.com ...

  4. JVM调优实战

      JVM调优实战 文档修订记录 版本 日期 撰写人 审核人 批准人 变更摘要 & 修订位置                                                   ...

  5. 生产环境下JVM调优参数的设置实例

    JVM基础:生产环境参数实例及分析 原始配置: -Xms128m -Xmx128m -XX:NewSize=64m -XX:PermSize=64m -XX:+UseConcMarkSweepGC - ...

  6. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  7. 第五章 JVM调优(待续)

    Java虚拟机内存模型 JVM内存分配参数 垃圾收集基础 常用调优案列和方法 实用JVM参数 实战JVM调优

  8. jvm调优原则

    合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...

  9. JVM调优和深入了解性能优化

    JVM调优的本质: 并不是显著的提高系统性能,不是说你调了,性能就能提升几倍或者上十倍,JVM调优,主要调的是稳定.如果你的系统出现了频繁的垃圾回收,这个时候系统是不稳定的,所以需要我们来进行JVM调 ...

随机推荐

  1. Zepto源码笔记(一)

    最近在研究Zepto的源码,这是第一篇分析,欢迎大家继续关注,第一次写源码笔记,希望大家多指点指点,第一篇文章由于首次分析原因不会有太多干货,希望后面的文章能成为各位大大心目中的干货. Zepto是一 ...

  2. ShopEx访问提示Incompatible file format: The encoded file has format major ID 2, whereas the Loader expects 4

    今天测试了下ShopEx程序,但是ShopEx安装时(程序放在public_html目录下的test目录中)遇到了问题,提示错误如下:Fatal error: Incompatible file fo ...

  3. 网站的优化----首页优化---app调取服务端数据

    高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...

  4. EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

    EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) 原因:重复的release了某个对象

  5. Teach Yourself Scheme in Fixnum Days 13 Jump跳转

    Jumps One of the signal features of Scheme is its support for jumps or nonlocal control. Specificall ...

  6. CH Round #53 -密室

    描述 有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉.每个密室由一扇门 ...

  7. Linux中应用程序如何使用系统调用syscall

    最近在做Android,其中一个任务是写一个能在Linux命令行运行的测试AP,运行这个AP就能关闭设备电源,即Power Off. 在 Linux内核中已经找到了关闭电源的函数kernel_powe ...

  8. Go语言的构建方法总结

    趁着近期要换工作的空闲时间,看了一下Go语言,与C++相比,Go语言的确在不少地方轻便了不少,例如:增加了内置的字符串类型.多个返回值.支持协程.简单的构建方法等等.使得在生产效率方面有了不少的提高. ...

  9. 优质办公体验,掌上OA一机hold住全场

    20多年前,人们希望可以脱离文件满天飞的办公办公环境,OA办公自动化出现了:随后.人们希望能在不同部门.不同分支机构间互通有无,打破信息孤岛.应用孤岛.数据孤岛,协同OA出现了:今天,人们梦想随时随地 ...

  10. samsungGalaxyS4USB驱动

    http://www.samsung.com/cn/support/usefulsoftware/KIES/JSP