JVM优化深度剖析

目录

一. JVM回顾

(一)什么是JVM

 (二)JVM与操作系统

(三)JVM、JRE、JDK 的关系

 (四)Java虚拟机规范和 Java 语言规范的关系

 二. java虚拟机的内存管理

(一)JVM整体架构

 (二)JVM运行时内存

 1.PC 程序计数器

2. 虚拟机栈

 3. 本地方法栈

 4. 堆

 5. 元空间

 6. 方法区

7.  运行时常量池

 8. 直接内存

 (三)实战OutOfMemoryError异常

3.1 Java堆溢出

 3.2 虚拟机栈和本地方法栈溢出

 3.3 运行时常量池和方法区溢出

 3.4 直接内存溢出

 三. JVM加载机制详解

(一)类装载子系统

1.1 类加载子系统介绍

 1.2 类加载器ClassLoader角色

 1.3 类加载的执行过程

 1.4 与

 (二)类加载器

 2.1 类加载器的作用

 2.2 类加载器分类

 (三)双亲委派模型

3.1 什么是双亲委派

 3.2 为什么需要双亲委派模型?

3.3 如何实现双亲委派模型 

 (四)自定义加类加载器

4.1 为什么要自定义类加载器

 4.2 自定义函数调用过程

4.3 自定义类加载器实现

​ 

(五)ClassLoader源码剖析

5.1 类的关系图

 5.2 Launcher核心类的源码剖析

 5.3 ClassLoader 源码剖析

 四. 垃圾回收机制及算法

(一)垃圾回收概述

 (二)垃圾回收-对象是否已死

2.1 判断对象是否存活 - 引用计数算法

2.2 判断对象是否存活-可达性分析算法  

 (三)垃圾收集算法

 3.1 分代收集理论

 3.2 标记-清除算法

 3.3 标记-复制算法

 3.4 标记-整理算法

 (四)垃圾收集器

4.1垃圾收集器概述

 4.2 Serial收集器

 4.3 ParNew 收集器

 4.4 Parallel Scavenge收集器

 4.5 Serial Old收集器

 4.6 Parallel Old收集器

4.7 CMS 收集器 

​ 4.8 G1收集器

 五. 常用指令与可视化调优工具

(一)常用指令

1.1 jps

1.2 jinfo  

 1.3 jstat

 1.4 jstack

 1.5 jmap

 1.6 jhat

(二)JVM常用工具

2.1 Jconsole 监控管理工具

 2.2 VisualVM 可视化优化工具

 六. GC日志分析

(一)GC日志参数

 1.1 GC日志参数

1.2 常用垃圾收集器参数 

 (二)GC日志分析

2.1 日志的含义

 2.2 使用 ParNew + Serial Old 的组合进行内存回收

 2.3 使用 Parallel Scavenge + Parallel Old 的组合进行内存回收

 2.4 大对象回收分析

 (三)日志分析工具

3.1 日志工具简介

3.2 测试准备  

 3.3 GCeasy

 ​

 3.4 GCViewer

 七. JVM调优实战

(一)tomcat与JVM调优

(二) 安装tomcat部署项目

2.1 下载并安装tomcat

 2.2 配置tomcat8

2.3 部署web项目 

 (三)使用Apache Jmeter进行测试

 3.1下载安装jmeter

 3.2 使用步骤

 (四)调整tomcat参数进行优化

4.1 优化吞吐量

 (五)调整JVM参数进行优化

5.1 设置并行垃圾回收器

5.2 查看GC日志文件  

 5.3调整年轻代大小

 5.4查看GC日志

 5.5 设置G1垃圾收集器


一. JVM回顾

(一)什么是JVM

 

 (二)JVM与操作系统

 

 

 

从图中可以看到,有了 JVM 这个抽象层之后, Java 就可以实现跨平台了。 JVM 只需要保证能够正确执行 .class 文件,就可以运行在诸如 Linux Windows MacOS 等平台上了。
Java 跨平台的意义在于一次编译,处处运行,能够做到这一点 JVM 功不可没。比如我们在 Maven 仓库下载同一版本的 jar 包就可以到处运行,不需要在每个平台上再编译一次。
现在的一些 JVM 的扩展语言,比如 Clojure JRuby Groovy 等,编译到最后都是 .class 文件, Java 语言的维护者,只需要控制好 JVM 这个解析器,就可以将这些扩展语言无缝的运行在 JVM 之上了。

 

 我们用一句话概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。

(三)JVMJREJDK 的关系

 

 

 (四)Java虚拟机规范和 Java 语言规范的关系

 

 

 

 

 

 二. java虚拟机的内存管理

(一)JVM整体架构

 

 

 

 (二)JVM运行时内存

Java 虚拟机有自动内存管理机制,如果出现面的问题,排查错误就必须要了解虚拟机是怎样使用内存的。

 

 

 

 

 针对JDK8虚拟机内存详解

 

 

 

 

 1.PC 程序计数器

 

 

Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。
因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为 线程私有 的内存。

2. 虚拟机栈

 

 

 

 

栈帧 (Stack Frame) 是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入 栈到出栈的过程。

 

 

 

 

 

 

 3. 本地方法栈

 4.

4.1 Java 堆概念

 

 

 

 

 Java8以后,由于方法区的内存不在分配在Java堆上,而是存储于本地内存元空间Metaspace中,所以永久代就不存在了,在几天前(2018925)Java11正式发布以后,我从官网上找到了关于Java11中垃圾收集器的官方文档, 文档中没有提到永久代,而只有青年代和老年代。

 4.2 年轻代和老年代

 

 

 

 

 

从图中可以看出:
堆大小 = 新生代 + 老年代 。其中,堆的大小可以通过参数 –Xms -Xmx 来指定。

4.3 对象分配过程 

 

 

 分配对象的流程:

 

 4.4 GC

 

 5. 元空间

 

 2. 5.1 为什么要废弃永久代,引入元空间?

 

 6. 方法区

 

 

元空间、永久代是方法区具体的落地实现。方法区看作是一块独立于 Java 堆的内存空间,它主要是用来存储所加载的类信息的

 创建对象各数据区域的声明:

 

 

 

 

 

 

 

 

7.  运行时常量池

 

 对字节码文件反编译之后,查看常量池相关信息:

 

 

 在方活中对常量池表的符号引用

 

 8. 直接内存

 

 

 

 

 

 (三)实战OutOfMemoryError异常

3.1 Java堆溢出

 

 

 3.2 虚拟机栈和本地方法栈溢出

 

 

 

 

 

 

 

 

 

 3.3 运行时常量池和方法区溢出

 

 

 JDK 6中的运行结果

 3.4 直接内存溢出

 运行结果:

 三. JVM加载机制详解

(一)类装载子系统

1.1 类加载子系统介绍

 

 1.2 类加载器ClassLoader角色

 

 1.3 类加载的执行过程

 

 

 

 1.2.2 链接

 

 

 

 

 

 

 

 

 

 1.4 <cinit>与<init>

 

 

 

 

 (二)类加载器

 2.1 类加载器的作用

 

 2.2 类加载器分类

 

 

 

 

 (三)双亲委派模型

3.1 什么是双亲委派

 

 3.2 为什么需要双亲委派模型?

3.3 如何实现双亲委派模型 

 

 

 

 

 (四)自定义加类加载器

4.1 为什么要自定义类加载器

 4.2 自定义函数调用过程

4.3 自定义类加载器实现

 

 

 

 

 

(五)ClassLoader源码剖析

5.1 类的关系图

 关系类图如下:

 5.2 Launcher核心类的源码剖析

 

 

 

 

 

 

 

 

 5.3 ClassLoader 源码剖析

ClassLoader 类,它是一个抽象类,其后所有的类加载器都继承自 ClassLoader (不包括启动类加载器),这里我们主要介绍 ClassLoader 中几个比较重要的方法。

 

 

 

 

 四. 垃圾回收机制及算法

(一)垃圾回收概述

 

 (二)垃圾回收-对象是否已死

2.1 判断对象是否存活 - 引用计数算法

2.2 判断对象是否存活-可达性分析算法  

2.2.1 可达性分析算法

 

 

 

 

 

 

 

 

 

 

 (三)垃圾收集算法

 3.1 分代收集理论

 

 3.2 标记-清除算法

 3.3 标记-复制算法

 

 3.4 标记-整理算法

 

 (四)垃圾收集器

4.1垃圾收集器概述

 

 

 

 

 

 

 4.2 Serial收集器

 4.3 ParNew 收集器

 

 4.4 Parallel Scavenge收集器

 

 4.5 Serial Old收集器

 4.6 Parallel Old收集器

4.7 CMS 收集器 

 

 

 

 

 

 

 

 4.8 G1收集器

 

 

 

 

 

 

 并发标记阶段(Concurrent Marking

 

 

 

 

 五. 常用指令与可视化调优工具

(一)常用指令

1.1 jps

 

1.2 jinfo  

 

 

 1.3 jstat

 

 

 

 1.4 jstack

 

 

 

 1.5 jmap

 

 jmap -dump:live,format=b,file=dump.bin 11666

 

 

 1.6 jhat

 

 jhat dump.bin

(二)JVM常用工具

2.1 Jconsole 监控管理工具

 

 

编译运行 JConsoleDemo , 运行时设置的虚拟机参数为 -Xms100m -Xmx100m -XX:+UseSerialGC ,
%JAVA_HOME%\bin 目录下 , 启动 jconsole.exe , 将自动搜索出本机运行的所有虚拟机进程 , 这里我们选择JConsoleDemo 对应的进程 2464

 

 

 

 

 

 

 

 

 2.2 VisualVM 可视化优化工具

 

 安装好插件后, 选择一个正在运行的java程序就可以查看程序监控的主界面了

 

 

 六. GC日志分析

GC 日志是一个很重要的工具,它准确记录了每一次的 GC 的执行时间和执行结果,通过分析 GC 日志可以优化堆设置和 GC 设置,或者改进应用程序的对象分配模式。

(一)GC日志参数

 1.1 GC日志参数

 例如,使用如下参数启动:

1.2 常用垃圾收集器参数 

 (二)GC日志分析

2.1 日志的含义

 2.2 使用 ParNew + Serial Old 的组合进行内存回收

 

 2.3 使用 Parallel Scavenge + Parallel Old 的组合进行内存回收

 

 

 2.4 大对象回收分析

 

 (三)日志分析工具

3.1 日志工具简介

3.2 测试准备  

 

 3.3 GCeasy

这是一个在线分析日志的工具,主要功能是免费的,存在部分收费,地址: https://gceasy.io/
把上篇博客生成的日志文件,上传分析,就会接到可视化界面

 

 

 3.4 GCViewer

GCViewer 是一个小工具,可以可视化展示 生成的详细 GC 输出。支持 Sun / Oracle
IBM HP BEA Java 虚拟机。它
GNU LGPL 下发布的免费软件。
下载: https://sourceforge.net/projects/gcviewer /
使用简介:
java -jar gcviewer-1.37-SNAPSHOT.jar

 

 七. JVM调优实战

(一)tomcatJVM调优

(二) 安装tomcat部署项目

2.1 下载并安装tomcat

 2.2 配置tomcat8

 

 

2.3 部署web项目 

 

 (三)使用Apache Jmeter进行测试

 3.1下载安装jmeter

 3.2 使用步骤

 

 

 

 

 

 (四)调整tomcat参数进行优化

4.1 优化吞吐量

 

 

 

 

 

 

 

 

 (五)调整JVM参数进行优化

测试通过 jvm 参数进行优化,为了测试一致性,依然将最大线程数设置为 500
启用 nio2 运行模式

5.1 设置并行垃圾回收器

 

5.2 查看GC日志文件  

 

 5.3调整年轻代大小

 

 5.4查看GC日志

 5.5 设置G1垃圾收集器

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值