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


    一、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后的老年代空间大小

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    20180404
    20180323
    20180315
    mongodb
    linux 集群 读写分离 session入库 负载均衡 配置
    linux 搭建配置 lnmp搭建
    有语义标签
    CSS标签属性
    使用QQ登录商城
    ajax 跨域
  • 原文地址:https://www.cnblogs.com/lujinhong2/p/4637203.html
Copyright © 2020-2023  润新知