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"
原文地址:https://www.cnblogs.com/lifeone/p/6283771.html