JVM 性能调优

原则:无监控不调优

内存和GC原理

  • JAVA内存结构 永久区程序计数器

  • 一般需要优化的内存区为

  • 堆内存的构成 新生代老年代

    堆内存结构

    新生代分为eden(伊甸园)、survivor0、survivor1(幸存者;分为两块,新生代中的GC使用的是复制模式,交替复制清空)。这三块的容量关系一般为8:1:1 。新生代和老年代的比例一般为1:3

    有关GC(垃圾收集)机制,可参考: http://www.jianshu.com/p/5228e940cfd2

    1. JAVA new出一个对象ObjectA时,若它特别大,直接进入 老年代 ,其他都进入 新生代 中的eden。经过一次GC之后。若 新生代
      中的对象还有引用指向ObjectA。它将进入 新生代 中的
      survivor0 。第二次GC时,若还存在指向ObjectA的引用,ObjectA将复制到 survivor1 ,并清空 *survivor0 *。 这就是GC原理中的 复制模式,保证了有连续完整的整块内存来接收每一次回收后幸存对象。
    2. 新生代 中经过好几次的GC之后还没有被回收的对象,将进入 老年代
  • java对象分配的优化

    • 栈上分配 栈上可以存对象!没想到吧? 栈上分配模式将线程私有小对象(经过逃逸分析)直接放在栈上,无须GC回收。提升效率。虚拟机已有对应的默认配置,无须调整
      ps: 逃逸分析 EscapeAnalysis
/**
*逃逸分析测试类
*1.User对象在方法内被实例化时,对象未逃脱。被分配在栈内存中,不需要GC回收
*2.当User有外部引用时,对象逃脱。运行时间大大加长
*/
public class PartionOnStack {
   class User{
       public int id;
       public String name;
   }
   User user; //有外部引用时,对象逃脱
   public  void foo() {
       User user = new User(); //对象未逃脱。全部被分配在栈内存中
       user.id=1;
       user.name="66666";
   }
   public static void main(String[] args) {
       System.out.println("start-----------");
       long beginTime=System.currentTimeMillis();
       PartionOnStack pos=new PartionOnStack();
       for(int i=0;i<100000000;i++)
       {
           pos.foo();
       }
       long endTime=System.currentTimeMillis();
       System.out.println("总共运行----"+(endTime-beginTime)+"ms");
    }
}
  • 线程本地分配(Thread Local Allacation Buffer) 默认占用1%eden区,多线程的时候不竞争eden就可以申请空间,提高效率。虚拟机已有对应的默认配置,无须调整
  • 分配功能关闭和开启 -XX:+DoEscapeAnalysis(逃逸分析开启)-XX:+EliminateAllocations(标量替换开启) -XX:+UseTLAB(使用本地缓存) -XX:+PrintGC(打印GC信息)。jvm虚拟机默认都是开启的。如果依次设置为“-” 不开启状态。会发现效率越来越低。全开启状态下。若方法内部都为私有小对象,GC一次都不会运行,效率大大提高。

调优方式

  • 堆内存最大最小值设置 : -Xmx10M 堆的最大值,-Xms10M堆的起始值 .调优时建议最小值跟最大值一致。直接占用到最大。省去程序自己去分配去GC的过程,这些过程本身也会影响性能。
  • 堆内存参数调整 用VisualVM观察虚拟机堆信息
  • OutOfMemory的监控 配置jvm参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/sam/Downloads OOM发生时,在配置的路径下可找到dump文件。导入到VisualVM中可查看具体信息
    堆信息
  • 栈空间:栈空间配置 -Xss128k 栈空间调大可增加递归调用次数。每一次的函数调用生成栈帧,请求的栈深度大于配置的最大深度时就会StackOverFlowError,在递归调用时最有可能溢出。栈空间调小,允许存在更多的线程,并发性能会更好。根据实际情况调节。
  • 典型tomcat优化配置
    set JAVA_OPTS=
    • -Xms4g //根据实际服务器情况
    • -Xmx4g //根据实际服务器情况
    • -Xss512k
    • -XX:+AggressiveOpts //开启全部jvm的默认优化选项
    • -XX:+UseBiasedLocking //偏向锁 一般情况都是需要配置

      偏向锁的目的是为了在无锁竞争的情况下避免在锁获取过程中执行不必要的CAS原子指令;现有的CAS原子指令虽然相对于重量级锁来说开销比较小但还是存在非常可观的本地延迟。而偏向锁则针对拥有当前锁的线程,允许其在竞争不存在的情况下,直接进入同步的代码块,无需同步操作,从而获取了相当的性能提升。

    • -XX:PermSize=64M //永久区大小 jdk8之后改为了metaspace
    • -XX:MaxPermSize=300M //永久区最大值 类多的情况下,设大
    • -XX:+DisableExplicitGC //不能显式调用GC System.gc() 因为程序中调用GC方法将破坏配置中的优化选项
    • -XX:+UseConcMarkSweepGC //使用CMS缩短响应时间,并发收集,低停顿
    • -XX:+UseParNewGC //并行收集新生代垃圾
    • -XX:+CMSParallelRemarkEnabled //在使用UseParNewGC的情况下,尽量减少mark的时间
    • -XX:+UseCMSCompactAtFullCollection //使用并发收集器时,开启老年代的压缩,使碎片减少
    • -XX:LargePageSizeInBytes=128m //内存分页大小对性能的提升
    • -XX:+UseFastAccessorMethods //get/set方法转为本地代码
  • 压力测试工具
    • JMeter安装(Mac):brew install jmeter --with-plugins 运行:open /usr/local/bin/jmeter
    • 测试方式请百度谷歌
  • 垃圾收集算法
  • 垃圾收集器选择

PS:合理规范的代码及数据库的优化,也是性能优化的重要部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容