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"
  • 相关阅读:
    背水一战 Windows 10 (90)
    背水一战 Windows 10 (89)
    背水一战 Windows 10 (88)
    背水一战 Windows 10 (87)
    背水一战 Windows 10 (86)
    背水一战 Windows 10 (85)
    背水一战 Windows 10 (84)
    背水一战 Windows 10 (83)
    背水一战 Windows 10 (82)
    背水一战 Windows 10 (81)
  • 原文地址:https://www.cnblogs.com/lifeone/p/6283771.html
Copyright © 2011-2022 走看看