JVM、GC调优

来源:互联网 发布:江苏教育频道网络直播 编辑:程序博客网 时间:2024/06/07 07:51

一、JVM运行时数据区域


程序计数器:(线程私有)是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。

虚拟机栈:(线程私有)虚拟机栈是描述的JAVA方法执行的内存模型,每个方法执行的时候都会分配一个栈帧,用于存储局部变量表、操作栈、动态链接及方法参数等,每个方法从执行到完成就对应一个栈帧的入栈与出栈。局部变量表存放了编译期可知的各种基本数据类型、对象引用。

        本地方法栈:与虚拟机栈相似,只不过是为虚拟机执行NATIVE方法服务的,Hotspot虚拟机直接把虚拟机栈与本地方法栈合二为一了。

:(线程公有)用于存放对象实例(虚拟机规范写的是所有的对象都在堆上分配,但栈上分配、标量替换等JIT优化技术发展)

方法区:(线程公有)用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等,是虚拟机堆的逻辑部分,所以称之为非堆。Hotspot虚拟机使用永久代(Permanent Generation)实现方法区。

一些总结:

1、程度计数器是唯一不会出现OOM的部分

2、Hotspot JVM中虚拟机栈与本地方法栈在一起

3、对象绝大部分是在堆上分配(栈上分配、标量替换优化技术)

4、运行时常量池(run-time constant pool)是方法区的一部分,用于存放编译期生成的各种字面量和符号引用

5、堆、方法区是线程共享的,栈、程序计数器是线程私有

6、直接内存,它并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,如NIO的channel与Buffer可以通过native方法直接分配堆外内存。


二、垃圾收集器与内存分配策略

三个问题:

1什么对象可垃圾回收?

2什么时候垃圾回收? 

3 如何回收?

根搜索算法

当前主流商用虚拟机均采用此算法来判定对象是否存活(即是否可被回收)。算法思路是通过“GC Roots”对象做为起始节点,向下搜索引用链,当一个对象没有任何引用链相连时则说明此对象是不可用的(即可被垃圾回收)。

JAVA语言中可GC Roots对象有如下几种:

虚拟机栈(栈帧中的本地变量表)中的引用的对象;

本地方法栈中引用的对象;

方法区中的静态类属性引用对象;

方法区中的常量引用对象;

JAVA语言中的4种引用类型

强引用:如" Object o = new Object()",只在引用在,对象永远不会被回收。

软引用:JVM发生OOM前会把这些对象天列进回收范围并进行第二次回收。JDK中通过SoftRefrence实现虚引用。

弱引用:比软引用更弱一些,只能生成到下次垃圾收集之前。当垃圾收集时,无论是否内存空间足够,都会回收只被弱引用关联的对象。JDK中通过WeakRefrence实现虚引用。

虚引用:最弱的一种引用关系,虚引用对对象是否存活没任何影响,也无法通过虚引用来取得一个对象实例。将一个对象设置成虚引用的唯一目的是希望能在这个对象被回收时收到一个系统通知。JDK中通过PhantomRefrence实现虚引用。

对象生存还是死亡?

根搜索算法中不可达的对象在垃圾回收时并非是“非死不可的”,真正宣告对象死亡至少需要两次标记的过程,当第一次标记后会判断是否有必要执行finalize方法(判断标准是对象类是否覆盖finalize方法或者finalize方法已经执行过),若需要执行则将此对象放入F-Quene对列中。

垃圾收集算法

标记-清除算法:

最基础的算法,算法分为两个阶段:标记各清除,首先标记需要被回收的对象,标记完后统一回收所有被标记的对象。两个缺点:效率问题,内存空间碎片问题

复制算法:

缺点是内存使用率底

标记-整理算法

分代整理算法

将堆内存划分几个区域,不同区域采用不同垃圾回收算法。一般分为新生代和老年代,新生代对象存活率低,有老年代做担保,采用复制算法回收垃圾,老年代对象存活率高,无担保内存,则采用标记-清除或者标记-整理算法回收垃圾。

垃圾收集器

收集器详细介绍请参考http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

如何选择垃圾回收器?

吞吐量优先的计算型应用采用Paralle Old收集器,

响应优先的应用采用CMS


VM Options:

输出GC日志:

-XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCTimeStamps -Xloggc:gc.log

堆内存大小设置:

-Xms3G -Xmx3G 

新生代大小:

-XX:NewSize=1G -XX:MaxNewSize=1G  或者-Xmn1G

新生代中Eden与survivor比率:

-XX:SurvivorRatio=8

虚拟机栈内存:

-Xss256k 

方法区(永久代)大小设置:

-XX:PermSize=128m -XX:MaxPermSize=128m 

CMS/G1收集器设置:

-XX:+UseConcMarkSweepGC or -XX:+UseG1GC

老年代并发收集器:Enables the parallel garbage collectors, which are optimized for throughput and average response time
-XX:+UseParallelOldGC




JVM进程启动VM Options配置例子:

server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=8 -XX:+UseParallelOldGC -XX:NewSize=1G -XX:MaxNewSize=1G 

-XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCTimeStamps -Xloggc:gc.log


参考:

周志明《深入理解JAVA虚拟机》

Categories of Java HotSpot VM Options

Java HotSpot VM Options

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning


JAVA SE 8 Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide



0 0
原创粉丝点击