JVM

2017-02-08  本文已影响0人  云烟1f3bca320ba6

JVM

jvm.png

​ 线程私有,主要用于线程切换能恢复到正确的执行位置。执行java方法时这个计数器为当前字节码的位置,如果是native方法的时候为空。

​ 线程私有,每个方法执行的时候创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

​ 局部变量表存放了编译期可知的各种基本数据类型,对象引用和returnAddress类型。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。

​ 和虚拟机栈类似

​ 线程共享。所有对象实例和数组都在堆上分配,垃圾收集器的主要区域。

​ 线程共享。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。

​ 方法区的一部分。存放编译期生成的各种字面量和符号引用。

GC

判断对象存活算法

​ 给对象添加一个引用计数器,有地方引用的时候,计数器值加1,引用失效的时候,计数器减1。计数器为0的对象不可能被使用。

​ 通过gc root为起点向下搜索,搜索经过的路径成为引用链,当一个对象到引用链没有相连时,证明此对象不可用。

GC算法

​ 标记出要收集的对象,标记完成后统一清除。问题是效率低,而且会产生大量内存碎片。

​ 将内存分为两块,每次只使用一块,当内存用完了,将存活的对象复制到另一块内存上,将使用过的内存一次清理掉。

​ 标记出要收集的对象,标记完成后让所有存活的对象都向一端移动,直接清理掉端边界的内存。

垃圾收集器

gc.png

​ 单线程收集器,进行垃圾收集时,暂停其他线程。

​ Serial收集器的多线程版本,

​ 使用复制算法的收集器,并行。目标是达到一个可控制的吞吐量。

​ Serial收集器的老年代版本

​ Parallel Scavenge收集器的老年代版本

​ 以获取最短回收停顿时间为目标的收集器。

​ 并行与并发:充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者
CPU核心)来缩短Stop-The-World停顿的时间;

​ 空间整合:整体基于标记-整理算法,局部使用复制算法,减少内存碎片。

​ 可预测的停顿。

JVM参数

堆设置

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小

收集器设置

-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

垃圾回收统计信息

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename

并行收集器设置

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集线程数.
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)

并发收集器设置

-XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况.
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.

上一篇下一篇

猜你喜欢

热点阅读