一、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调优基础 分类: B1_JAVA 2015-03-14 09:33 250人阅读 评论(0) 收藏的更多相关文章

  1. ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏

    我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好.因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用.异步请求的用户体验要比同步请求好,因此一般情 ...

  2. Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. iOS开源库--最全的整理 分类: ios相关 2015-04-08 09:20 486人阅读 评论(0) 收藏

    youtube下载神器:https://github.com/rg3/youtube-dl 我擦咧 vim插件:https://github.com/Valloric/YouCompleteMe vi ...

  4. 基于命令行编译打包phonegap for android应用 分类: Android Phonegap 2015-05-10 10:33 73人阅读 评论(0) 收藏

    也许你习惯了使用Eclipse编译和打包Android应用.不过,对于使用html5+js开发的phonegap应用,本文建议你抛弃Eclipse,改为使用命令行模式,绝对的快速和方便. 一直以来,E ...

  5. Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏

    效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. C# IIS应用程序池辅助类 分类: C# Helper 2014-07-19 09:50 249人阅读 评论(0) 收藏

    using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...

  7. PIGS 分类: POJ 图论 2015-08-10 09:15 3人阅读 评论(0) 收藏

    PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18209 Accepted: 8277 Description Mir ...

  8. Babelfish 分类: 哈希 2015-08-04 09:25 2人阅读 评论(0) 收藏

    Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36398 Accepted: 15554 Descripti ...

  9. 周赛-Colored Sticks 分类: 比赛 2015-08-02 09:33 7人阅读 评论(0) 收藏

    Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 32423 Accepted: 8556 Desc ...

随机推荐

  1. DM9000C网卡驱动

    目的:通过学习,掌握如何移植.编写DM9000C网卡驱动 一.概述: DM9000是一款高度集成低功耗快速以太网处理器,该芯片集成了MAC和PHY.DM9000可以和CPU直接连接,支持8位.16位和 ...

  2. less---查看文件

  3. 微信小程序从零开始开发步骤(六)4种页面跳转的方法

    用法:用于页面跳转,相当于html里面的<a></a>标签. API教程:https://mp.weixin.qq.com/debug/wxadoc/dev/component ...

  4. hdu2768Cat vs. Dog (反建法,最大独立集)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. dump var_dump print print_r的区别

    dump var_dump print print_r的区别 一.总结 用dump()来打印就对了 1.echo和print:不能打印复合型和资源型数据: 2.var_dump()和print_r() ...

  6. 29.局部和全局重载new delete

    #include <iostream> #include <Windows.h> using namespace std; //全局内存管理,统计释放内存,分配内存 //重载全 ...

  7. MFC窗口显隐

    使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK.不过此函数在w2k的user32.dll里 ...

  8. [置顶] MVC三层架构在各框架中的特征

    1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端 ...

  9. Talk the Talk

     Talk the Talk Mark Richards in Any pRoFESSion, jargon is used so that individuals within that pro- ...

  10. 使用Microsoft.Office.Interop.Excel时,64位问题

    前不久,碰到一个问题. 曾经用的好好的Microsoft.Office.Interop.Excel实现的导出Excel,迁移至64位server后,就出现: 检索 COM 类工厂中 CLSID 为 { ...