JVM虚拟机调优
一、JVM引言
1、JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也叫虚拟计算机。操作系统装入JVM是通过jdk中Java.exe来完成的
二、JVM内存结构
1、方法区:
方法区 (Mthod Area): 也称“永久代(permanent generation)”,“非堆”,用于储存虚拟机加载的类信息,常量,静态变量,是各个线程共享的内存区域,运行时常量池:方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中.
2、栈:
描述的是java方法执行的内存模型,每个方法被执行的时候,都会创建一个“栈帧”用于存储局部变量(包括参数),操作栈,方法出口等信息。
每个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的.局部变量表:存放八种基本类型,对象引用,其中64位长度的long和double类型的数据会占用两个局部变量的空间,其余数据类型只占一个。
局部变量表是在编译时完成分配的,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间不再改变.
3、堆(Heap):
也叫java堆,CG堆。是JVM中所管理的内存中最大的一块内存区域,是线程共享的,在JVM启动时创建。存放了对象的实例及数组(所有new的对象)
JVM的优化也可以称为堆的优化.
4、程序计数器:
是最小的一块内存,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,
字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,异常处理,
线程恢复等基础功能都需要依赖计数器完成.
三、JVM代的划分
永久代(Permanent Generation)
年轻代(Young Generation)
老年代(Old Generation)
Heap(堆) = 年轻代 (Eden + survivor1+survivor2) + 老年代
四、触发GC和Full GC
GC: 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发GC
Full GC:
老年代(Old )被写满
永久代(Perm)被写满
System.gc()被显式调用
五、优化参数配置
1、堆设置
-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:设置永久代大小
2、收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
-XX:+UseG1GC 设置G1收集器
3、垃圾回收统计信息
-verbose:gc
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
4、并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
5、并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
六、优化工具的启动虚拟机
1、打开工具的.ini加入如下配置
-verbose:gc
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:D:\jvm.log
2、查看jvm.log文件
查看触发了Gc Full Gc
3、更改配置
-Xms3096m 设置堆最小空间
-Xmx3096m 设置堆最大空间
-XX:MaxPermSize=256m 设置永久代空间