JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

JVM 类加载机制

JVM中有哪些内存区域,分别都是用来干嘛的


目录

对象的分配与引用

为通过“loadReplicasFromDisk”方法的执行,去磁盘上加载需要的副

本数据.然后通过“ReplicaManager”对象实例完成了这个操作

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

首先一个main线程肯定会来执行main()方法里的代码

main线程自己是有一个Java虚拟机栈的,他会把main()方法的栈帧压入Java虚拟机栈

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

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

这个过程如下图

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

此时发现在loadReplicasFromDisk()方法里,有一个“repliaManager”变量,那么就会在loadReplicasFromDisk()

方法对应的栈帧里,放入一个“repliaManager”变量。

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

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

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

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


JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

“replicaManager.load()”如果这行代码执行结束了,此时会怎么样?

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

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

时一旦loadReplicasFromDisk()方法的栈帧出栈,那么大家会发现那个栈帧里的局部变量,“replicaManager”,也就没有了。

也就是说,没有任何一个变量指向Java堆内存里的“ReplicaManager”实例对象了。

我们创建的Java对象其实都是占用内存资源的

Java堆内存里的那个“ReplicaManager”实例对象已经没有人引用他了

这个对象实际上已经没用了,该干的事儿都干完了,现在你还让他留在内存里干啥呢?

一般来说,我们会在一台机器上启动一个Java系统,机器的内存资源是有限的,比如就4个G的内存。然后我们启动的Java系统本质就是一个JVM进程,他负责运行我们的系统的代码。

那么这个JVM进程本身也是会占用机器上的部分内存资源,比如占用2G的内存资源。

们在JVM的Java堆内存中创建的对象,其实本质也是会占用JVM的内存资源的,比如“ReplicaManager”实例对象,会占用500字节的内存。

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

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

既然“ReplicaManager”对象实例是不需要使用的,已经没有任何方法的局部变量在引用这个实例对象了,而且他还空占着内存资源,那么我们应该怎么处理呢?

答案呼之欲出:JVM的垃圾回收机制

JVM本身是有垃圾回收机制的,他是一个后台自动运行的线程

你只要启动一个JVM进程,他就会自带这么一个垃圾回收的后台线程。

这个线程会在后台不断检查JVM堆内存中的各个实例对象

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

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

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

JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?

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

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

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

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

展开阅读全文

页面更新:2024-06-16

标签:垃圾   线程   变量   字节   局部   虚拟机   后台   实例   内存空间   进程   对象   机制   内存   代码   方法   资源   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top