【Java虚拟机系列】Java虚拟机了解

本文目录:

1、Java内存结构
2、堆内存构成
3、垃圾回收算法、垃圾收集器选择
4、Java对象分配
5、Java虚拟机常用参数设置以及调优

全文内容:
1、Java内存结构

1.1、方法区(永久代perm space)
1.2、虚拟机栈(线程栈、方法栈帧、局部变量,线程之间数据隔离,所谓的“线程本地栈”)
1.3、本地方法栈(native method本地方法调用相关)、程序计数器(线程方法执行需要分别维护一个计数)
1.4、堆内存(新生代、老年代)

2、堆内存构成


新生代分为Eden、S0、S1区,垃圾回收使用copying复制算法;老年代为old space,垃圾回收使用标记清除算法。
堆内存垃圾回收总结为:新生代new存活对象少,使用copying复制算法回收;老年代垃圾少,绝大部分对象存活周期长,使用标记压缩算法回收。

3、垃圾回收算法、垃圾收集器选择
3.1、什么是垃圾?
String str = new String("hello world"); str=null;没有任何引用的对象为垃圾。
3.2、垃圾回收算法有哪些?
垃圾回收算法分为:标记清除(缺点:产生内存碎片)、复制算法(优点:效率高;缺点:内存浪费,内存利用率不高)、标记压缩算法(效率比标记清除略低;使用在老年代垃圾回收)。
3.3、如何判定对象为垃圾?
判定对象为垃圾,不使用引用计数方式(因为存在循环计数)而使用GC Roots正向可达方式。
3.4、垃圾收集器选择
垃圾收集器选择?serial collector单线程;parallel collector并发量大、不过每次垃圾回收,JVM需要停顿;CMS collector并发分块收集,停顿时间短;G1 collector下一代垃圾回收器,不仅停顿时间短,并且并发量大,Java9里边可能会作为默认垃圾回收器使用。

4、Java对象的分配
4.1、Java对象的分配分为栈上分配(线程私有小对象、无逃逸、支持标量替换、无需调整默认开启)
4.2、线程本地分配TLAB(小对象、占用Eden,默认1%、多线程的时候不用竞争Eden就可以申请空间,提高效率、无需调整默认开启)
4.3、老年代(大对象)
4.4、Eden新生代

5、Java虚拟机常用参数设置以及调优
5.1、JVM参数规则说明
- 标准参数;-X 非标准参数;-XX 不稳定参数,下一个版本可能会取消。比如查看Java版本命令为:java -version。
5.2、JVM常用参数设置
5.2.1、堆设置

-Xms 初始化堆大小
-Xmx 最大堆大小
-Xss 线程栈大小
-XX:NewSize=n 设置年轻代大小
-XX:NewRatio=n 设置年轻代和老年代的比值,如,3表示年轻代:老年代为1:3
-XX:SurvivorRatio=n 年轻代中Eden区与两个survivor区的比值,注意survivor区有两个,如,3表示Eden:survivor为3:2,一个survivor占整个年轻代的1/5
-XX:MaxPermSize=n 设置持久代(方法区或永久代)大小

5.2.2、收集器设置

-XX:+UseSerialGC 设置串行收集器,单线程版本,开发使用,不用于生产环境
-XX:+UseParallelGC 设置并行收集器,并发量大,停顿稍微久
-XX:+UseConcMarkSweepGC 设置并发收集器(并发量大,分块处理),停顿短

5.2.3、垃圾回收统计信息

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

5.2.4、内存分配、内存溢出设置

-XX:+HeapDumpOnOutOfMemoryError 堆内存溢出,做dump处理
-XX:+HeapDumpPath=c:\tmp\jvm_dump.bin
-XX:-DoEscapeAnalysis -表示不做逃逸分析,对象不在栈中分配(默认开启逃逸分析,小对象分配选择优先级为:线程栈、TLAB线程本地应用缓冲区、大对象放在老年代、其它绝大部分对象放在Eden区)
-XX:-EliminateAllocations 不做标量替换,对象不在栈中分配
-XX:-UseTLAB -表示对象不在线程本地应用buffer缓冲区分配,TLAB使用Eden内存,默认1%占比

5.3、Tomcat JVM优化配置

set JAVA_OPTS=
    -server
    -Xms2g
    -Xmx2g
    -Xss512k
    -XX:+AggressiveOpts
    -XX:+UseBiasedLocking
    -XX:PermSize=64M // JDK1.8已经废弃该配置
    -XX:MaxPermSize=300M // JDK1.8已经废弃该配置
    -XX:MetaspaceSize=256m
    -XX:MaxMetaspaceSize=512m
    -XX:MaxDirectMemorySize=1g
    -XX:+DisableExplicitGC
    -XX:+UseConcMarkSweepGC 使用CMS缩短响应时间,并发收集,低停顿
    -XX:CMSMaxAbortablePrecleanTime=5000
    -XX:+CMSClassUnloadingEnabled
    -XX:CMSInitiatingOccupancyFraction=80
    -XX:+UseCMSInitiatingOccupancyOnly
    -XX:+ExplicitGCInvokesConcurrent
    -Dsun.rmi.dgc.server.gcInterval=2592000000
    -Dsun.rmi.dgc.client.gcInterval=2592000000
    -XX:SurvivorRatio=10
    -XX:+UseParNewGC 并行收集新生代的垃圾
    -XX:ParallelGCThreads=4
    -XX:+CMSParallelRemarkEnabled 在使用UseParNewGC的情况下,尽量减少mark的时间
    -XX:+UseCMSCompactAtFullCollection 使用并发收集器时,开启对老年代的压缩,减少内存碎片
    -XX:LargePageSizeInBytes=128m 内存分页大小对性能的提升
    -XX:+UseFastAccessorMethods get/set方法转成本地代码
    -Xloggc:/tmp/logs/gc.log 存放gc日志
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/logs/java.hprof

posted on 2017-06-10 23:33  pinefantasy  阅读(153)  评论(0编辑  收藏  举报

导航