JVM

JVM 知识梳理

2018-05-02  本文已影响33人  iHelin

JVM 体系总体分四大块:

  1. 类的加载机制
  2. jvm内存结构
  3. GC算法 垃圾回收
  4. GC分析 命令调优
JVM 思维导图

1. 类的加载机制

主要关注点:

类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类的生命周期

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三步是类的加载的过程,如下图:


类的生命周期

类加载器

类加载器

类加载机制

2. jvm内存结构

主要关注点:

JVM 内存结构

JVM 内存结构

方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序计数器是线程私有的内存区域。

对象分配规则

如何通过参数来控制个各个内存区域
参考此文章:jvm系列(二):JVM内存结构

3. GC算法 垃圾回收

主要关注点:

对象存活判断

判断对象是否存活一般有两种方式:

GC算法

GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

垃圾回收器

GC算法和垃圾回收器算法图解以及更详细内容参考: jvm系列(三):GC算法 垃圾收集器

4. GC分析 命令调优

主要关注点:

GC日志分析

摘录GC日志一部分

Young GC回收日志:

  1. 2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]

Full GC回收日志:

  1. 2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]

通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内
通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数。

Young GC日志:


Young GC日志

Full GC日志:


Full GC日志

调优命令

Sun JDK监控和故障处理命令有jpsjstatjmapjhatjstackjinfo

详细的命令使用参考这里:jvm系列(四):jvm调优-命令篇

调优工具

常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。

部分摘录自纯洁的微笑博客

上一篇 下一篇

猜你喜欢

热点阅读