JVM
- 程序计数器
线程私有,主要用于线程切换能恢复到正确的执行位置。执行java方法时这个计数器为当前字节码的位置,如果是native方法的时候为空。
- java虚拟机栈
线程私有,每个方法执行的时候创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
局部变量表存放了编译期可知的各种基本数据类型,对象引用和returnAddress类型。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。
- 本地方法栈
和虚拟机栈类似
- java堆
线程共享。所有对象实例和数组都在堆上分配,垃圾收集器的主要区域。
- 方法区
线程共享。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。
- 运行时常量池
方法区的一部分。存放编译期生成的各种字面量和符号引用。
GC
判断对象存活算法
- 引用计数算法
给对象添加一个引用计数器,有地方引用的时候,计数器值加1,引用失效的时候,计数器减1。计数器为0的对象不可能被使用。
- 可达性分析算法
通过gc root为起点向下搜索,搜索经过的路径成为引用链,当一个对象到引用链没有相连时,证明此对象不可用。
GC算法
- 标记清除算法
标记出要收集的对象,标记完成后统一清除。问题是效率低,而且会产生大量内存碎片。
- 复制算法
将内存分为两块,每次只使用一块,当内存用完了,将存活的对象复制到另一块内存上,将使用过的内存一次清理掉。
- 标记整理算法
标记出要收集的对象,标记完成后让所有存活的对象都向一端移动,直接清理掉端边界的内存。
垃圾收集器
- Serial收集器
单线程收集器,进行垃圾收集时,暂停其他线程。
- ParNew收集器
Serial收集器的多线程版本,
- Parallel Scavenge
使用复制算法的收集器,并行。目标是达到一个可控制的吞吐量。
- Serial Old收集器
Serial收集器的老年代版本
- Parallel Old收集器
Parallel Scavenge收集器的老年代版本
- CMS收集器
以获取最短回收停顿时间为目标的收集器。
- G1收集器
并行与并发:充分利用多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数.并行收集线程数.