目录
为通过“loadReplicasFromDisk”方法的执行,去磁盘上加载需要的副
本数据.然后通过“ReplicaManager”对象实例完成了这个操作
首先一个main线程肯定会来执行main()方法里的代码
main线程自己是有一个Java虚拟机栈的,他会把main()方法的栈帧压入Java虚拟机栈
接着main()方法里调用了loadReplicasFromDisk()方法
那么就会创建loadReplicasFromDisk()方法的栈帧,压入main线程的Java虚拟机栈里去
这个过程如下图
此时发现在loadReplicasFromDisk()方法里,有一个“repliaManager”变量,那么就会在loadReplicasFromDisk()
方法对应的栈帧里,放入一个“repliaManager”变量。
接着发现在代码里创建了一个“ReplicaManager”类的实例对象,此时就会在Java堆内存中分配这个实例对象的内存空间。
同时,让loadReplicasFromDisk()方法的栈帧内的“replicaManager”局部变量去指向那个Java堆内存里的ReplicaManager实例对象
接下来,就会执行通过“replicaManager”局部变量引用的“ReplicaManager”实例对象去执行他的load()方法,去完成我们实现的业务逻辑。
“replicaManager.load()”如果这行代码执行结束了,此时会怎么样?
loadReplicasFromDisk()方法执行完毕,此时就会把loadReplicasFromDisk()方法对应的栈帧从main线程的Java虚拟机栈里出栈
时一旦loadReplicasFromDisk()方法的栈帧出栈,那么大家会发现那个栈帧里的局部变量,“replicaManager”,也就没有了。
也就是说,没有任何一个变量指向Java堆内存里的“ReplicaManager”实例对象了。
Java堆内存里的那个“ReplicaManager”实例对象已经没有人引用他了
这个对象实际上已经没用了,该干的事儿都干完了,现在你还让他留在内存里干啥呢?
一般来说,我们会在一台机器上启动一个Java系统,机器的内存资源是有限的,比如就4个G的内存。然后我们启动的Java系统本质就是一个JVM进程,他负责运行我们的系统的代码。
那么这个JVM进程本身也是会占用机器上的部分内存资源,比如占用2G的内存资源。
们在JVM的Java堆内存中创建的对象,其实本质也是会占用JVM的内存资源的,比如“ReplicaManager”实例对象,会占用500字节的内存。
核心 :在Java堆内存里创建的对象,都是占用内存资源的,而且内存资源有限.
既然“ReplicaManager”对象实例是不需要使用的,已经没有任何方法的局部变量在引用这个实例对象了,而且他还空占着内存资源,那么我们应该怎么处理呢?
答案呼之欲出:JVM的垃圾回收机制
JVM本身是有垃圾回收机制的,他是一个后台自动运行的线程
你只要启动一个JVM进程,他就会自带这么一个垃圾回收的后台线程。
这个线程会在后台不断检查JVM堆内存中的各个实例对象
如果某个实例对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方在指向他。
那么这个垃圾回收线程,就会把这个没人指向的“ReplicaManager”实例对象给回收掉,从内存里清除掉,让他不再占用任何内存资源。
这些不再被人指向的对象实例,即JVM中的“垃圾”,就会定期的被后台垃圾回收线程清理掉,不断释放内存资源.
一个对象对内存空间的占用,大致分为两块:
比如对象头,如果在64位的linux操作系统上,会占用16字节,然后如果你的实例对象内部有个int类型的实例变量,会占用4个字节,如果是long类型的实例变量,会占用8个字节。如果是数组、Map之类的,那么就会占用更多的内存了。
页面更新:2024-06-16
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号