JVM基础
一、目的
通过对线上jvm常见故障的用例的分析,提高大家对系统故障的分析和处理能力,减少系统由故障造成的宕机时间,提高系统的可用性。
二、JVM概况
jvm为java虚拟机的简称,在这里一般指Oralce旗下的Hotspot,在处理故障前首先必须了解JVM相关基础知识。在此简单介绍如下。
1.1.1 虚拟机的基本结构
JVM内存基本结构如下
各部分功能详细在此不重复描述,请自行百度或查阅相关书籍。
1.1.2 垃圾回收
回收算法、垃圾回收器与堆内存分配的相关参数
回收算法
1、Mark-Sweep(标记-清除)算法
2、Copying(复制)算法
3、Mark-Compact(标记-整理)算法
4、Generational Collection(分代收集)算法
以上算法具体过程及适用场景请自行百度或参考相关书籍。
垃圾回收器
1、Serial收集器
2、ParNew收集器
3、Parallel Scavenge收集器
4、Serial Old收集器
5、Parallel Old收集器
6、CMS收集器
7、G1收集器
以上垃圾回收器详细信息请自行百度或参考相关书籍。
堆内存分配参数
Jvm堆内存分配的几个重要参数,对应设置的内存区域,如图所示
配置参数 |
功能 |
-Xms |
初始堆大小。如:-Xms256m |
-Xmx |
最大堆大小。如:-Xmx512m |
-Xmn |
新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90% |
-Xss |
JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。 |
-XX:NewRatio |
新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3 |
-XX:SurvivorRatio |
新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10 |
-XX:PermSize |
永久代(方法区)的初始大小 |
-XX:MaxPermSize |
永久代(方法区)的最大值 |
-XX:+PrintGCDetails |
打印 GC 信息 |
-XX:+HeapDumpOnOutOfMemoryError |
让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用 |
-Xloggc |
|
-XX:+PrintGCDateStamps |
|
-XX:+PrintGCApplicationStoppedTime |
|
-Djava.rmi.server.hostname |
|
-Dcom.sun.management.jmxremote |
|
-Dcom.sun.management.jmxremote.port |
|
-Dcom.sun.management.jmxremote.ssl |
|
-Dcom.sun.management.jmxremote.authenticate |
|