JVM 整体架构及内存调优(一)| 学习笔记

简介: 快速学习 JVM 整体架构及内存调优。

开发者学堂课程【JVM 整体架构及内存调优 :JVM 整体架构及内存调优(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/1207/detail/18174


JVM 整体架构及内存调优

 

内容介绍

一、JVM 回顾

二、java 虚拟机的内存管理

三、JVM 加载机制详解

四、垃圾回收机制及算法

五、JVM 调优

 

一、JVM 回顾

JVM 是  java Virtual Machine ( java 虚拟机)的缩写,但实际上其他语言也会用到 JVM,比如 Kafka 的源码 scala。

JVM 是-种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

常见的虚拟机如下:

(1)HotSpot:Oracle/Sun JDK 和 OpenJDK 都使用 HotSpot VM 的相同核心;

(2)J9:J9是 IBM 开发的高度模块化的 JVM;

(3)JRockit:JRockit 与 HotSpot 同属于 Oracle,目前为止 Oracle 一直在推进 HotSpot 与 JRockit 两款各有优势的虚拟机进行融合互补;

(4)Zing:由 Azul Systems 根据 HostPot 为基础改进的高性能低延迟的JVM;

(5)Dalvik:Android 上的 Dalvik 虽然名字不叫 JVM,但就是不折不扣的 JVM。

image.png

可根据以下问题来了解整体内容。

问题1:为什么要在程序和操作系统中间添加一个JVM ?

JVM是虚拟机,目前主要讲解 java 层面的作用。java 语言本身上是一个命令对象,进行了充分的抽象化,另外还提供了一些自动内存管理的特征。实际上,这些特征脱离 JVM 在操作系统上实现是不太可能的,所以需要中间的 JVM 作为抽象层。

问题2:应用程序、JVM、 操作系统之间的关系?

有了JVM这一抽象层之后,java 就可以实现跨平台。JVM 只需要保证程序能够正常运行 class 文件、编译 class 文件,然后就可以在  UNIX、Windows、Mac OS 平台上运行。java 跨平台的意义在于通过一次编译之后可以处处运行,即 maven 层下载同一个版本的 jar 包,这个 jar 包可以处处运行,而不需要在每一个平台上进行编译。现在 JVM 也存在一些拓展列表等,编译到最后都是 class 的方式。

如下图:

image.png

操作系统通过虚拟机申请内存,实际上是通过操作系统进行分配;操作系统分配内存,包括初始内存和后续分配的内存,最终分配到程序。

程序编译成 class 文件,然后到 JVM,再去调用操作系统的函数。JVM 和操作系统之间除了中间的一个转接的作用之外,还有一些其他的问题。

JVM、JRE、JDK 三者之间的关系可以如下图表示:

image.png 

JVM、JRE、JDK 三者之间的关系可以用一个包含的关系表示。即JDK包含JRE,同时也包含JVM。

JRE 是 JVM 完成一次编译时需要的一个基本的类库。比如怎么操作文件、怎么连接网络等。而 java 体系是会一次性的将 JVM 所运行、所需要的类库都传递给 JVM,加上一些基础的类库,就成了 java 运行时的环境。这个环境称为JRE。另外,JDK 除了 JRE,还提供了一些非常小的工具,比如 java C ,java jar 这些工具命令。

 

二、java 虚拟机的内存管理

可以分为:类加载系统,运行时数据区,执行引擎。接下来是本地方法接口,本地方法库等。类加载子系统后面会详细讲解。

运行时数据区实际上就是JVM内存,包括方法区、堆、栈、程序计数器、本地方法栈等。

image.png 

1.运行时数据区的组成

(1)程序计数器

首先编译完 class 文件之后,会生成一次编码文件。然后程序计数器就是一个指针,即字接码文件。实际上对于操作系统而言,就是一行一行的命令,它需要去按顺序去执行。程序计数器就是用指针去标识它,从而执行到哪一行。

(2)虚拟机栈

虚拟机栈由栈针组成。可以理解为由许多栈针组成的虚拟机栈,而栈针里有常见的局部变量表、操作主栈、动态验机,方法出口等。另外虚拟机栈实际上是一个线程私有的,包括栈针里面成员组成、局部变量、操作栈、动态连接、方法出口等是线程私有的。

除了虚拟机栈之外,还有程序计数器也是线程私有的。因为程序计数器实际上也是现成的一个维度,需要去执行程序,最终执行了哪一行。

(3)本地方法栈

本地方法栈也是线程私有的,跟虚拟机栈不同的是,它调用的是 native 方法。native 方法就是 JVM 底层的一些接口,C++的接口。点开源码会经常看到带有 native 标识的东西。

(4)堆

是线程共享的。堆内存是一个最复杂的一个内存结构。它会帮忙保存对象实例,里面会有年轻代、老年代、伊甸园区等。后续的排查问题,包括对内存的使用、优化等都是在这里面去操作的。

(5)方法区

是线程共享的。方法区主要存储一些已被虚拟机加载的一些类信息,常量、静态变量等。例如虚拟站有个 -Xs,则可以去指点群体栈的大小;还有堆 -Xms 等为 JVM 的一些参数。

image.png

相关文章
|
2月前
|
缓存 算法 Java
聚焦Java应用程序的内存管理和调优技巧
在现代软件开发中,性能优化对提升用户体验和系统稳定性至关重要。本文聚焦Java应用程序的内存管理和调优技巧。从理解Java内存模型入手,深入探讨堆内存的管理与优化,揭示如何避免内存泄漏,利用工具检测问题,并介绍高效字符串处理及数据结构选择的方法。同时,解析垃圾回收机制及其调优策略,包括不同回收器的选择与配置。此外,还介绍了调整堆大小、运用对象池和缓存技术等高级技巧。通过这些方法,开发者能有效提升应用性能和稳定性。
37 1
|
3月前
|
JSON Java BI
一次Java性能调优实践【代码+JVM 性能提升70%】
这是我第一次对系统进行调优,涉及代码和JVM层面的调优。如果你能看到最后的话,或许会对你日常的开发有帮助,可以避免像我一样,犯一些低级别的错误。本次调优的代码是埋点系统中的报表分析功能,小公司,开发结束后,没有Code Review环节,所以下面某些问题,也许在Code Review环节就可以避免。
148 0
一次Java性能调优实践【代码+JVM 性能提升70%】
|
5月前
|
缓存 监控 算法
Linux内存碎片深度剖析:原理、处理与分析全指南
Linux内存碎片深度剖析:原理、处理与分析全指南
1406 0
Linux内存碎片深度剖析:原理、处理与分析全指南
|
5月前
|
存储 算法 Java
工作5年,我竟发现JVM只用这4个技巧就可以轻松调优
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。
28 0
|
11月前
|
存储 算法 Java
JVM架构和内存管理优化
JVM架构和内存管理优化
|
11月前
|
缓存 Java 程序员
如何写出高性能代码(三)优化内存回收(GC)
可复用性在这里指的是,大多数的对象都是可以被复用的,这些可以被复用的对象就没必要每次都新建出来,浪费内存空间了。 处了巧用数据特性 中的例子,我这里再个Java中已经被用到的例子,这个还得从一段奇怪的代码说起。
58 0
|
存储 Java 数据安全/隐私保护
项目实战典型案例15——高并发环境下由于使用全局变量导致数据混乱 高并发环境下对象被大量创建,导致GC并是CPU飙升
项目实战典型案例15——高并发环境下由于使用全局变量导致数据混乱 高并发环境下对象被大量创建,导致GC并是CPU飙升
139 0
项目实战典型案例15——高并发环境下由于使用全局变量导致数据混乱 高并发环境下对象被大量创建,导致GC并是CPU飙升
|
算法 Java 大数据
JVM 整体架构及内存调优(二)| 学习笔记
快速学习 JVM 整体架构及内存调优。
101 0
JVM 整体架构及内存调优(二)| 学习笔记
|
Arthas 监控 Java
JVM 整体架构及内存调优(三)| 学习笔记
快速学习 JVM 整体架构及内存调优。
172 0
JVM 整体架构及内存调优(三)| 学习笔记
|
缓存 算法 安全
如何写出高性能代码之优化内存回收(GC)
同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员 不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。
229 0
如何写出高性能代码之优化内存回收(GC)
下一篇
无影云桌面