程序员首页投稿(暂停使用,暂停投稿)Java学习笔记

《深入理解Java虚拟机》读书笔记

2017-12-12  本文已影响352人  哪吒小子
image.png

前言

微信公众号

自己在阅读《深入理解Java虚拟机》后做了部分的整理,内容有些是来自网络,如有侵权,请联系邮箱:nezhaxiaozi@qq.com

本书第一次阅读,所以并没有全篇通读,主要的阅读的章节是

总之此书很值得一读,不管是理解JVM内存模型或者GC的机制及怎么去JVM调优这本书上写的还是挺全面的。

第2章 Java内存区域与内存溢出异常

概述

对于Java程序员来说,在虚拟机自动内存管理机制下,不需要为new操作去写配对的delete/free代码,不容易出现内存泄漏。但是如果出现内存泄漏问题,如果不了解虚拟机的机制,便难以定位。

运行时数据区域

下图是Java运行时数据区域划分图

运行时数据区域
区域 是否线程共享 是否会内存溢出
程序计数器 不会
java虚拟机栈
本地方法栈
方法区

1.程序计数器(线程私有)

2.Java虚拟机栈(线程私有)

3.本地方法栈

4.Java堆(线程共享)

Eden:From Survivor:To Survivor比值为8:1:1

Java堆内存结构

5.方法区/元空间(永久代)(线程共享)

6.运行时常量池

7.直接内存

对象的访问定位

通过句柄访问对象 通过直接指针

内存参数的调节见这边

JAVA对象在JVM中内存分配

第3章 Java垃圾回收机器与内存分配策略

概述

思考GC需要完成的3件事情:

再回头看看第二章介绍的Java内存运行时区域的各个部分:

判断Java中对象存活的算法

1.引用计数算法

给对象添加引用计数器,当有地方引用它时就加1,引用失效就减1,为0时就认为对象不再被使用可回收。该算法失效简单,判断高效,但并不被主流虚拟机采用,主要原因是它很难解决对象之间相互循环引用的问题。

2.可达性分析算法

通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),如果一个对象到GC Roots没有引用链相连,则该对象是不可用的。

在Java语言中,可作为GC Roots的对象包括:

垃圾收集算法

标记-清除算法 复制算法 分代收集算法

垃圾收集器

gc_for_hotspot

1.Serial收集器(单线程的收集器)

Serial收集器

2.ParNew收集器(Serial收集器的多线程版本)

ParNew收集器

3.Parallel Scavenge收集器

吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

4.Serial Old收集器

Serial Old收集器

5.Parallel Old收集器

Parallel Old收集器

6.CMS收集器

CMS收集器

7.G1收集器

G1收集器

理解GC日志

详细的解读,请查阅本书籍。

内存分配与回收策略

第4章 JVM性能监控与故障处理工具

概述

定位问题时,知识和经验是关键基础、数据(运行日志、异常堆栈、GC日志、线程快照、堆转储快照)是依据、工具是运用知识处理数据的手段。

JDK命令行工具

1.jps: 虚拟机进程状况工具

image.png image.png

2.jstat:虚拟机统计信息监视工具

image.png image.png

3.jinfo:Java配置信息工具

image.png

4.jmap:Java内存映像工具

image.png image.png

5.jhat:虚拟机堆转储快照分析工具

6.jstack:Java堆栈跟踪工具

image.png image.png

7.HSDIS:JIT生成代码反编译

image.png

JDK可视化工具

1.JConsole:Java监视与管理控制台

2.VisualVM:多合一故障处理工具

image.png

第7章 虚拟机类加载机制

概述

类加载的时机

类加载的过程

1.加载

2.验证

3.准备

4.解析

5.初始化

类加载器

类与类加载器

双亲委派模型

关于双亲委派模型,这篇文章写得简单易懂:http://www.jianshu.com/p/acc7595f1b9d

image.png

JVM常用参数调节

内存参数 <span id="neicun"></span>

参数 作用
-Xmx 堆大小的最大值。当前主流虚拟机的堆都是可扩展的
-Xms 堆大小的最小值。可以设置成和 -Xmx 一样的值
-Xmn 新生代的大小。现代虚拟机都是“分代”的,因此堆空间由新生代和老年代组成。新生代增大,相应地老年代就减小。Sun官方推荐新生代占整个堆的3/8
-Xss 每个线程的堆栈大小。该值影响一台机器能够创建的线程数上限
-XX:MaxPermSize= 永久代的最大值。永久代是 HotSpot 特有的,HotSpot 用永久代来实现方法区
-XX:PermSize= 永久代的最小值。可以设置成和 -XX:MaxPermSize 一样的值
-XX:SurvivorRatio= Eden 和 Survivor 的比值。基于“复制”的垃圾收集器又会把新生代分为一个 Eden 和两个 Survivor,如果该参数为8,就表示 Eden 占新生代的80%,而两个 Survivor 各占10%。默认值为8
-XX:PretenureSizeThreshold= 直接晋升到老年代的对象大小。大于这个参数的对象将直接在老年代分配。默认值为0,表示不启用
-XX:HandlePromotionFailure= 是否允许分配担保失败。在 JDK 6 Update 24 后该参数已经失效。
-XX:MaxTenuringThreshold= 对象晋升到老年代的年龄。对象每经过一次 Minor GC 后年龄就加1,超过这个值时就进入老年代。默认值为15
-XX:MaxDirectMemorySize= 直接内存的最大值。对于频繁使用 nio 的应用,应该显式设置该参数,默认值为0

GC参数

垃圾收集器 参数 备注
Serial(新生代) -XX:+UseSerialGC 虚拟机在 Client 模式下的默认值,打开此开关后,使用 Serial + Serial Old 的收集器组合。Serial 是一个单线程的收集器
ParNew(新生代) -XX:+UseParNewGC 强制使用 ParNew,打开此开关后,使用 ParNew + Serial Old 的收集器组合。ParNew 是一个多线程的收集器,也是 server 模式下首选的新生代收集器
-XX:ParallelGCThreads= 垃圾收集的线程数
Parallel Scavenge(新生代) -XX:+UseParallelGC 虚拟机在 Server 模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old 的收集器组合
-XX:MaxGCPauseMillis= 单位毫秒,收集器尽可能保证单次内存回收停顿的时间不超过这个值。
-XX:GCTimeRatio= 总的用于 gc 的时间占应用程序的百分比,该参数用于控制程序的吞吐量
-XX:+UseAdaptiveSizePolicy 设置了这个参数后,就不再需要指定新生代的大小(-Xmn)、 Eden 和 Survisor 的比例(-XX:SurvivorRatio)以及晋升老年代对象的年龄(-XX:PretenureSizeThreshold)了,因为该收集器会根据当前系统的运行情况自动调整。当然前提是先设置好前两个参数。
Serial Old(老年代) Serial Old 是 Serial 的老年代版本,主要用于 Client 模式下的老生代收集,同时也是 CMS 在发生 Concurrent Mode Failure 时的后备方案
Parallel Old(老年代) -XX:+UseParallelOldGC 打开此开关后,使用 Parallel Scavenge + Parallel Old 的收集器组合。Parallel Old 是 Parallel Scavenge 的老年代版本,在注重吞吐量和 CPU 资源敏感的场合,可以优先考虑这个组合
CMS(老年代) -XX:+UseConcMarkSweepGC 打开此开关后,使用 ParNew + CMS 的收集器组合。
-XX:CMSInitiatingOccupancyFraction= CMS 收集器在老年代空间被使用多少后触发垃圾收集
-XX:+UseCMSCompactAtFullCollection 在完成垃圾收集后是否要进行一次内存碎片整理
-XX:CMSFullGCsBeforeCompaction= 在进行若干次垃圾收集后才进行一次内存碎片整理

附图:可以配合使用的收集器组合

gc_for_hotspot

其他参数

参数 作用
-verbose:class 打印类加载过程
-XX:+PrintGCDetails 发生垃圾收集时打印 gc 日志,该参数会自动带上 -verbose:gc 和 -XX:+PrintGC
-XX:+PrintGCDateStamps / -XX:+PrintGCTimeStamps 打印 gc 的触发事件,可以和 -XX:+PrintGC 和 -XX:+PrintGCDetails 混用
-Xloggc:<path> gc 日志路径
-XX:+HeapDumpOnOutOfMemoryError 出现 OOM 时 dump 出内存快照用于事后分析
-XX:HeapDumpPath= 堆转储快照的文件路径

参考文章

1.Gino Zhang的博客总结的很全面 http://ginobefunny.com

2.关于双亲委派模型,这篇文章写得简单易懂:http://www.jianshu.com/p/acc7595f1b9d

上一篇 下一篇

猜你喜欢

热点阅读