一、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. HBase高速导入数据--BulkLoad

    Apache HBase是一个分布式的.面向列的开源数据库.它能够让我们随机的.实时的訪问大数据.可是如何有效的将数据导入到HBase呢?HBase有多种导入数据的方法.最直接的方法就是在MapRed ...

  2. vim-录制命令的使用

    使用vim时无意间触碰到q键,左下角出现“recording”这个标识,这是vim的一个强大功能. 他可以录 制一个宏(Macro),在开始记录后,会记录你所有的键盘输入,包括在insert模式下的输 ...

  3. redmine-bug 问题修改流程

    1.当我们接受到测试发过来的bug以后,首先就是针对描述,弄清出问题,如果不能重现或者是对问题不清楚,那么可以去找提出者确认 注意:有时候一个问题可能是经过几次重开或者追加提出的,这时候你一定要从头到 ...

  4. 洛谷P3954 成绩【民间数据】

    题目背景 数据已修复 题目描述 牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩×20%+小测成绩×30%+期末考试成绩×50% 牛牛想知道,这门课程自己最终能得到多少分. ...

  5. BZOJ2555: SubString(后缀自动机,LCT维护Parent树)

    Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...

  6. WEB安全实战(二)带你认识 XSS 攻击

    前言 上一篇文章写了关于 WEB 安全方面的实战,主要是解决 SQL 盲注的安全漏洞.这篇文章本来是要写一篇关于怎样防治 XSS 攻击的,可是想来想去,还是决定先从理论上认识一下 XSS 吧.下一篇文 ...

  7. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  8. 【SonicUI】关于字体高亮的问题。。

    m_pSonicString[1]->Format(_T("/c=%x, a='http://hi.csdn.net/', linkh=0xFF00F0, font, font_hei ...

  9. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  10. 86.八千万qq密码按相似度排序并统计密码出现次数,生成密码库

    存储qq的文件地址以及按照密码相似度排序的文件地址 //存储qq的文件的地址 ] = "QQ.txt"; //按照密码相似度排序的文件地址 ] = "QQpassword ...