IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM : 4 JVM的垃圾回收机制 -> 正文阅读

[Java知识库]JVM : 4 JVM的垃圾回收机制

1. 对象的分配与引用

有如下一段代码,通过 “loadReplicasFromDisk” 方法的执行,去磁盘上加载需要的副本数据。然后通过 “ReplicaManager” 对象实例完成这个操作。

根据 JVM运行原理,上述代码的运行流程如下:

首先一个 main 线程肯定会来执行 main() 方法里的代码,main 线程有一个Java虚拟机栈, 会把 main() 方法的栈帧压入 Java 虚拟机栈。

接着 main() 方法里调用了 loadReplicasFromDisk()方法。

那么就会创建 loadReplicasFromDisk() 方法的栈帧,压入 main 线程的 Java 虚拟机栈里去。

在 loadReplicasFromDisk() 方法里,有一个 “replicaManager” 变量,他会在该方法对应的栈帧里,放入一个 “replicaManager” 变量。

接着在代码里创建了一个 “ReplicaManager” 类的实例对象,就会在 Java 堆内存中分配这个实例对象的内存空间。

同时,让 loadReplicasFromDisk() 方法的栈帧内的 “replicaManager” 局部变量去指向那个 Java 堆内存里的 ReplicaManager 实例对象,如下图:

接下来,就会执行通过 “replicaManager” 局部变量引用的 “ReplicaManager” 实例对象去执行它的 load() 方法,去完成要实现的业务逻辑。

?2. 一个方法执行完毕之后会怎么样?

在上述代码中,“replicaManager.load()” 方法里的代码执行完毕,那么方法就执行完毕了,也就是说 loadReplicasFromDisk() 方法就执行完毕了。

一旦你的 loadReplicasFromDisk() 方法执行完毕,就会把 loadReplicasFromDisk() 方法对应的栈帧从 main 线程的 Java 虚拟机栈里出栈。

一旦 loadReplicasFromDisk() 方法的栈帧出栈,那么在那个栈帧里的局部变量 “replicaManager” 也就没有了。此时就没有变量指向Java堆内存里的 “ReplicaManager” 实例对象。

3.? 创建的 Java对象都是占用内存资源的

?当 Java 堆内存里的 “ReplicaManager” 实例对象没有人引用它了,就不应该继续留在内存里了。

核心原因:我们在 Java 堆内存里创建的对象,都是占用内存资源的,而且内存资源有限

比如:JVM进程占用的部分内存资源为 2G,而“ReplicaManager” 实例对象,可能会占用500字节的内存。

4. 不再需要的那些对象应该怎么处理

当 “ReplicaManager” 对象实例不再需要使用,已经没有任何方法的局部变量在引用这个实例对象,而它还空占着内存资源,此时就该启动 JVM的垃圾回收机制

JVM本身有垃圾回收机制,当你启动一个JVM进程,它就会自带一个后台自动运行的垃圾回收的线程。该线程会在后台不断坚持 JVM 堆内存中的各个实例对象。

如果某个势力对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方指向他。

那么垃圾回收线程,就会把这个没人指向的 “ReplicaManager” 实例对象给回收掉,从内存里清除掉,让他不再占用任何内存资源。

这些不再被人指向的对象实例,即 JVM 中的“垃圾” ,就会定期的被后台垃圾回收线程清理掉,不断释放内存资源。

5. 思考题

我们创建的那些对象,到底在 Java 堆内存里会占用多少内存空间呢?

答: 一个对象对内存空间的占用,大致分为两块:

  • 一个是对象自己本身的一些信息
  • 一个是对象的实例变量作为数据占用的空间

比如对象头,如果在 64 位的linux 操作系统上,会占用 16 字节,然后如果你的实例对象内部有个 int 类型的实例变量,他会占用 4 个字节,如果是 long 类型的实例变量,会占用 8个字节,如果是数组、Map之类的,那么久会占用更多的内存了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-09-03 11:46:23  更:2021-09-03 11:48:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:50:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码