本文不许备从盘古开天地开始讲述JVM的种种,相关的文章网上太多了,大多也无非转来转去,连图都差很少。笔者只整理个提纲挈领的学习路线指南,并对本身学习过程当中遇到的坑和容易混淆和忽视的地方做个总结。html
内存区域划分有多个维度,相同区域在不一样维度的名称并不同。以下图所示java
这两个概念,不少时候都被当作是同一个概念。实际上,“方法区”是java虚拟机规范中对存放类信息,字段,方法,常量,静态变量,接口和常量池的内存区域的定义,而“永久代”则是HotSpot VM在1.8版本之前对于方法区的具体实现。因为java虚拟机规范并无对方法区的具体实现做限制,因此HotSpot VM和JRocket VM对于方法区的实现都是不同的,JRocket中就没有永久代的概念。而在1.8及1.8之后的版本中,HotSpot VM用"元空间"--metaspace来代替永久代,实现方法区。 这个变化带来的就是VM参数的变化,全部的PermGen都被替换成了MetaSpace。而且metaSpace再也不使用堆内存,而是使用系统内存。可是该发生的OOM同样会发生。缘由也基本都是加载到内存中的 class 数量太多或者体积太大。算法
GC算法和GC收集器也是两个维度的概念。 GC算法包括清除算法(也叫标记清除算法),复制算法,标记-整理算法。 不一样垃圾收集器针对不一样的内存区域,采用不一样的GC算法。 具体介绍,网上相关资料不少,能够参考这篇文章:blog.csdn.net/xiaoping091…浏览器
垃圾收集器经历了从串行收集器到并行收集器,再到并发收集器的进化过程。这三者的区别以下图所示tomcat
不一样版本默认使用的垃圾收集器以及支持开发者定制的垃圾收集器都是不同的 jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.9 默认垃圾收集器G1 与此同时,经过设置JVM参数也能够本身选择垃圾收集器。如要开启G1垃圾回收器,能够用-XX:+UseG1GC,支持G1垃圾回收器的JDK最低版本为JDK 7u4。在用户本身选择垃圾收集器的时候,要注意JDK版本的问题。 笔者用表格的形式列出了新生代和老年代的GC收集器的常见搭配方案:并发
频繁FullGC致使的stop the world的现象,会大大影响系统的稳定性。尽管一代又一代的垃圾收集器的优化,使得stop the world的时间愈来愈短,可是在大型应用中,仍是避之不及。 出发FullGC的状况有如下几种:eclipse
一般状况下,JVM的GC机制能保证应用的正常运行,致使系统频繁FullGC的缘由百分之九十都是内存溢出(OOM)。OOM分为如下几类:jvm
正确设置JVM参数,能够尽量多地避免系统资源浪费,尽量详细地掌握系统运行状况,而且对可能出现的问题防患于未然。ide
Xms:堆初始空间工具
Xmx:堆最大空间
Xmn:年轻代大小
XX:MaxNewSize 新生代最大空间 建议设置为整个堆的1/3到1/4
XX:NewSize
XX:MaxTenuringThreshold survivor中到老年代中的年龄阈值
Xss:每一个线程的栈大小
java -XX:+PrintCommandLineFlags -version 获得JDK建议的内存分配大小
tomcat设置catalina.sh:
export JAVA_OPTS="-server –Xms1024m -Xmx1024m -XX:+UseParallelOldGC -verbose:gc -Xloggc:../logs/gc.log
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
-XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集器类型
-XX:+PrintGCDetails亦可经过打印的GC日志的新生代、老年代名称判断
1.本机环境下,推荐一款idea上的插件VisualVM Launcher,实际就是联动了JDK开发包中自带的jvisualvm.exe监控软件。也能够设置远程监控。具体使用方法,能够参考这篇文章https://blog.csdn.net/wngpenghao/article/details/82884874IDEA Java性能分析插件VisualVM Launcher 配置(JAVA VisualVM 与Jconsole配置相同)
2.Linux的相关命令: jstat命令能够对jvm从各维度进行统计,详细使用参考jstat命令查看jvm的GC状况
3.VM参数设置时,指定打印出gc日志 -Xloggc:../logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 详细的参数设置以及gc日志该如何阅读,能够参考java之GC日志该怎么看
若是是使用jvisualvm就更方便了,直接点击如图所示的按钮便可:
因为实际工做中,能接触到JVM机会的机会并很少,因此笔者整理了一些经典实例