首页 > 其他 > 详细

jvm调优01

时间:2017-01-14 18:17:18      阅读:262      评论:0      收藏:0      [点我收藏+]

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  指定日志情况的保存路径

jvm调优01

原文:http://www.cnblogs.com/lifeone/p/6283771.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!