zoukankan      html  css  js  c++  java
  • jvm调优

    jvm参数设置可以查看:http://www.cnblogs.com/xrq730/p/4830692.html

    1、java虚拟机内存模型

      主要分为:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区

      

      1.1 程序计数器(ProgramCounter Register):

        一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器

        如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

        如果正在执行的是natvie方法,这个计数器值则为空(undefined)。

        此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError 情况的区域

      1.2 JAVA虚拟机栈(java virtual machine stacks):

        每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息

        java虚拟机栈的局部变量表存放了编译期可知的各种基本数据类型、对象应用和returnAddress类型

        如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常

        如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常

        可以通过-Xss设置栈的大小,其大小决定了函数可调用的深度,值越大,线程数越小

      1.3 本地方法栈(native method stacks):

        为虚拟机使用到的Native 方法服务

      1.4 java堆(java heap):

        主要用来存放对象和数组实例的地方,垃圾回收的主要区域,分为新生代和老年代

        新生代:

          程序刚创建的对象都是从新生代分配内存,新生代

          新生代又可细分为:Eden space区和两块大小相同的幸存区survivor(s0和s1或者from和头)

          可以通过-Xmn指定eden区的大小,通过-XX:SurvirorRation来调整幸存区的大小

        老年代:

          存放多次gc后仍然存活的对象

          新建的对象之间进入老年代的情况:

            ①.大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。

            ②.大的数组对象,切数组中无引用外部对象。

        通过-Xmx设置最大堆内存(新生代和老年代之和),-Xms设置最小堆内存(启动jvm时占用的系统内存的大小),通常将-Xmx和-Xms设置为一样的大小来减少gc的次数

      1.5 方法区

        各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据

        通过-XX:MaxPermSize设置方法区的最大值-XX:PermSize设置方法区的初始化大小

    2、常见的四种垃圾收集器(-XX:+UseParallelGC默认方式)

      2.1 新生代并行收集器(-XX:+UseParNewGC)

        暂停所有应用线程,启动多个线程进行垃圾回收

      2.2 新生代和老年代都用的并行回收器(-XX:+UseParallelOldGC)

        暂停所有应用线程,启动多个线程进行垃圾回收

      2.3 新生代和老年代都用的串行回收器(-XX:+UseSerialGC)

        暂停所有应用线程,启动一个线程进行垃圾回收

      2.4 CMS回收器(-XX:+UseConcMarkSweepGC)

        使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例

    3、调优方法

      3.1 新对象预留新生代

        由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率

      3.2 大对象进入老年代

        将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 可以通过-XX:PretenureSizeThreshold设置进入老年代的阀值

      3.3 稳定与震荡的堆大小

        稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致

      3.4 吞吐量优先

        尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器

        -XX:+UseParallelGC或使用-XX:+UseParallelOldGC

      3.5 降低停顿

        使用CMS回收器,同时减少fullGC的次数

    4、获取gc信息的方法

      4.1 -verbose:gc或者-XX:+PrintGC  获取gc信息

      4.2 -XX:+PrintGCDetails  获取更加详细的gc信息

      4.3 -XX:+PrintGCTimeStamps  获取GC的频率和间隔

      4.4 -XX:+PrintHeapAtGC  获取堆的使用情况

      4.5 -Xloggc:D:gc.log  指定日志情况的保存路径

    5、jvm调优实战-tomcat启动加速

      在tomcat的bin/catalina.bat文件的开头添加相关的配置

    rem 配置gc日志
    set CATALINA_OPTS=%CATALINA_OPTS% "-Xloggc:gc.log"
    
    rem 配置堆大小
    set CATALINA_OPTS=%CATALINA_OPTS% "-Xmx64M"
    set CATALINA_OPTS=%CATALINA_OPTS% "-Xms64M"
    
    rem 配置禁用gc
    set CATALINA_OPTS=%CATALINA_OPTS% "-XX:+DisableExplicitGC"
    
    rem 配置新生代的大小
    set CATALINA_OPTS=%CATALINA_OPTS% "-XX:NewRatio=2"
    
    rem 禁止jvm安全校验
    set CATALINA_OPTS=%CATALINA_OPTS% "-Xverify:none"
    
    rem 禁止用元数据回收
    set CATALINA_OPTS=%CATALINA_OPTS% "-Xnoclassgc"
  • 相关阅读:
    类方法代码重构寻找坏味道
    迭代二分查找二分查找
    系统牛逼[置顶] 使用RAMP理解内在动机 Understanding Intrinsic Motivation with RAMP
    对象服务器Webservices获取天气
    手机服务器Android消息推送(二)基于MQTT协议实现的推送功能
    概率小数2013年阿里巴巴暑期实习招聘笔试题目(不完整,笔试时间:2013.5.5)
    像素颜色JavaFX示例简易图片处理工具
    算法队列SPFA算法详解
    选择文件Eclipse制作jar包
    nullnull推箱子
  • 原文地址:https://www.cnblogs.com/lifeone/p/6283771.html
Copyright © 2011-2022 走看看