我是靠谱客的博主 踏实蜻蜓,最近开发中收集的这篇文章主要介绍有关Java虚拟机内存机制以及回收机制的简单理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先干计算机的对Java语言都不陌生,但是普遍网上的一些讲解总是停留在了“堆”与“栈”这两个层面上,但实际上这样的理解在我学习了一些书籍之后发现有些片面,这里我尽力去谈谈自己的理解仅仅作为学习的参考和日志。

1.首先不得不谈到的就是Java虚拟机运行时必然会提及到的几个数据区域,也就是我们在网上经常提及的Java的堆以及栈的部分。
(1)程序计数器,这是在运行时分配的很小的一部分区域,它作用是当前运行字节码文件的一个指示器,独立存存在于自身的进程当中,了解Java并发执行的人一定知道,Java并发执行时会互相竞争执行权,而当执行权竞争到时其他线程就得等它,否则就会出现线程安全问题,而停下来得线程得程序到底执行到那一步了,这个得靠计数器来记录。很明显,一些虚拟机中得本地方法执行时就不会记录了,直接就是空。顺带说一下,这个存储区域是我所知道得唯一 一个没有OutOfmemoryError的一个情况,它不共享,只为自身线程服务。
(2)Java虚拟机栈,这个东西学Java的人几乎没有陌生的,它的里面会存一些表格,里面主要是一些局部变量表格的信息,说是信息具体解释起来最主要的其实是对一些对象的引用,引用中存储着对象原本的地址,有c语言基础的应该理解更加简单一些,对象的地址那里才是对象本身。
(3)本地方法栈,这个实际更好理解,如果虚拟机栈是Java中方法局部变量等表格信息里面记录的是引用的话,那么本地方法栈就是Native方法所记录的引用,只是服务的对象不同,本质上原理却十分类似,有的虚拟机会把(2)(3)进行合并
(4)Java堆,这个大家耳熟的很,它可是内存中的一大块,Java虚拟机的回收机制其实也是主要针对于它的,它会存储对象的实例。实际到后面可能就提及栈通过引用找到堆里面的实例的数据,就是这么简单。。。
(5)方法区,它主要用于存已经被虚拟机加载的类的信息,常量,等信息。其中里面比较重要的是运行时常量池,虚拟机的回收机制主要是对这部分进行回收。
继续理解,什么是运行时的常量池,里面存储了字节码文件编译之后对生成的各种字面量和符号引用。
(6)直接内存,实际这不属于上面5个的部分,它属于额外区域。
2. 内存回收机制部分
(1)如果是不怎么了解虚拟机的机制的话,简单了解一些,实际Java虚拟机在运行的时侯和自身线程有关的内存部分实际不会太成为内存分配的难点和重点,因为它们随着线程本身的结束而释放掉,很难对内存有太大的威胁,我们现在主要的考虑还是针对于方法区以及堆区这种共享数据信息的部分进行一个垃圾处理的回收机制。
(2)Java回收机制最简单最直接所要面对的一个问题,怎么判断要回收的对象是哪些?然后才是怎么去回收对象。首先我们先介绍一个非常简单的算法:引用计数法,它的原理真的是超级简单粗暴,它会给每个对象添加一个计数器,然后每当引用它时计数器加1,每过一段时间计数器就减一,为0自然就直接清理掉该对象。但是我们可以想一下,如果我们创建两个对象他们彼此互相引用,啊,这就是一个bug所以当前的回收机制判断不会采用这个算法。
(3)可达性回收法,非常不错的一个算法,我们都知道,我们使用Java语言创建对象,它都是从底层一个对象引用另一个对象,所以我们只要从底层引用的对象节点出发往下找,只要没有与根这个点在连在一起的,那么这个对象也就变得不可用了,这也就是我们要进行回收的对象。当然具体判断对象不存在还有一点细节,就是对象需要在进行一次finalize()方法,如果已经执行过finalize或finalize方法没有覆盖那么就不对其回收,且两次标记才可能进行这个对象的回收,一次与root连接不了,一次执行finalize(),然后在finalize方法中又做一次标记,如果这次该对象被引用,就算得救,如果在finalize方法里没有得救那么第二次机会就算失去,只能回收掉。
垃圾回收算法:
简单普及:
标记清除法:说实话这是我看起来最崩溃的算法,他对每一个应该收回空间的点打一遍标记,然后再把标记的点也就是空间回收,这就造成了存储空间碎片实在太多,这再后面的处理过程中必须有一个算法完成内存空间的压缩整理才好进行后面的可能出现的大内存存储。
复制算法: 这个算法再原有标记清楚法上面有了改进,它分出一半空间存,把里面回收的对象内存打标记后,把留下来的复制到另一半,打标记那一半全部清除,这样复制的那一半就没有碎片的情况,都是连续的。
(这里,复制算法应用于当前的商业虚拟机当中,简单来说一开始分配空间时就分配一个Eden新生代,两个survivor,选其中一个survivor和Eden存储空间打标记,活下来的放,剩下的survivor里面,其余直接清空。)
标记整理:打标记方式与普通的一样,然后加了整理内存碎片的工作,算法流程上,打完标记直接让存活的往前靠,死去的往后,然后找到分割点直接清除。这部分应用于老年代,我得在这里说一下。

最后

以上就是踏实蜻蜓为你收集整理的有关Java虚拟机内存机制以及回收机制的简单理解的全部内容,希望文章能够帮你解决有关Java虚拟机内存机制以及回收机制的简单理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部