0

0

JVM内存区域和垃圾回收的分析(图文)

不言

不言

发布时间:2019-01-24 11:09:32

|

4763人浏览过

|

来源于博客园

转载

本篇文章给大家带来的内容是关于jvm内存区域和垃圾回收的分析(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、JVM简介

JVM,全称Java Virtual Machine,即Java虚拟机。以Java作为编程语言所编写的应用程序都是运行在JVM上的。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java有个非常重要的特点就是与平台的无关性,而JVM正是实现这一特点的关键。

JVM对程序的执行主要分为两个步骤,第一步是编译,即将.java的源文件编译成为.class的字节码文件,第二步是解释,JVM对字节码文件进行解释执行。两个步骤流程图分别如下两图所示:

 

二、JVM内存区域

JVM整个大系统又分为两个子系统。第一个是ClassLoader,即类加载器,功能是将编写的类加载到JVM中。第二个是Execution Engine,即执行引擎,负责对编译后的字节码文件进行解释执行。上述中Execution Engine又分为两部分,第一部分是Runtime data area,即运行时数据区域,即相当于JVM中的内存,第二部分是Native interface,即本地化接口,主要用于执行其他非Java编程语言编写的程序。

重点就是前者Runtime data area,它分为五个部分,分别是Method area(方法区),Heap(堆),VM stack(虚拟机栈),Program counter  register(程序计数器),Native method stack(本地方法栈)。前两者线程共享,后三者线程隔离。如下图所示:

概括地说,JVM初始运行的时候都会分配好Method area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配Program counter  register(程序计数器)、VM stack(虚拟机栈)、Native method stack(本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么把数据区域分为线程共享和线程隔离的原因,线程隔离的那三个区域的生命周期与所属线程相同,而线程共享的区域与Java程序运行的生命周期相同,所以这也是系统垃圾回收场所只发生在线程共享的区域(实际上对大部分虚拟机来说是发生在Heap上)的原因。关于内存溢出异常如下图所示:

 

1、Method area(方法区)

方法区包括常量池与静态域。存放了所加载类的信息(名称、修饰符等)、类的静态变量、类的常量、类的Field信息、类的方法信息。当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区。

2、Heap(堆)

堆是JVM所管理的内存中最大的一块,几乎所有的对象实例和数组都在此区域,可以认为Java中所有通过new创建的对象的内存都在此分配,堆中的对象的内存需要等待GC进行回收。

3、Program counter  register(程序计数器)

程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。

4、VM stack(虚拟机栈)

Bika.ai
Bika.ai

打造您的AI智能体员工团队

下载

虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧用于存储局部变量表(基本数据类型、对象的引用等)、操作数栈、动态链接、方法返回地址和一些额外的附加信息。

5、Native method stack(本地方法栈)

该区域与虚拟机栈所发挥的作用非常相似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操作系统(Native)方法服务。

三、JVM垃圾回收

JVM的GenerationalCollecting(垃圾回收)原理是把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。

通常JVM内存回收总是指Heap(堆)内存回收,确实只有Heap(堆)中的内容是动态申请分配的,所以以上对象的年轻代和年老代都是指的JVM的Heap(堆)空间,而持久代则是之前提到的Method area(方法区),不属于Heap(堆)。

1. 年轻代

Java应用在分配Java对象时,这些对象会被分配到年轻代堆空间中去

这个空间大多是小对象并且会被频繁回收

由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率

2. 年老代

年轻代堆空间的长期存活对象会转移到(也许是永久性转移)年老代堆空间

这个堆空间通常比年轻代的堆空间大,并且其空间增长速度较缓

由于大部分JVM堆空间都分配给了年老代,因此其垃圾回收算法需要更节省空间,此算法需要能够处理低垃圾密度的堆空间

3. 持久代

存放VM和Java类的元数据(metadata),以及interned字符串和类的静态变量

当这三个分代的堆空间比较紧张或者没有足够的空间来为新到的请求分配的时候,垃圾回收机制就会起作用。有两种类型的垃圾回收方式:次收集(Minor GC)和全收集(Full GC)。当年轻代堆空间满了的时候,会触发次收集将还存活的对象移到年老代堆空间。当年老代堆空间满了的时候,会触发一个覆盖全范围的对象堆的全收集。

至此是关于浅析JVM内存区域及垃圾回收,仅供参考。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

799

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

722

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

394

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16860

2023.08.03

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号