javamap清空后内存会变小吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javamap清空后内存会变小吗相关的知识,希望对你有一定的参考价值。
javamap清空后内存会变小吗,要判断怎样的对象是没用的对象。这里有2种方法:采用标记计数的方法: 给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。 当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:
采用根搜索算法: 从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的 判断完了哪些对象是没用的,这样就可以进行回收了 最简单的,就是直接清空那个需要被回收的对象。但是这又出现了一个问题,就是内存会被分为一块一块的小碎片。
为了解决这个问题,可以采用第二种方法,就是在之前的基础上将存活的对象给整理一下,使他们变成一个连续的内存,从而释放出连续的较大的内存空间。 还有一中回收方法就是采用复制的办法:将内存分为2块,一块用来存放对象,另一块用来放着,当存放对象的那块满了以后就将上面存活的对象给复制过来,然后在这块内存上工作,并且将之前的内存清空,当自己这块满了以后再复制回去,如此反复。
比较效率的一中做法是将以上的几种方法给结合起来。
首先将内存分块,分为新生代,老年代和永久代。 永久代用来存放代码,等一些基本不改变的数据, 新生代用来存放刚产生的一些对象,新生代又可分为3块。分别为Edon区,Survivor0,survivor1,刚产生的对象是放在Edon区中,当这个区块放满了以后就将其存活的部分复制到survivor0块中,并且将Edon区中的数据清空,等到survivor0满了就将其中的存活的数据放到survivor1中,清空survivor0,垃圾回收到了一定次数还未被回收的对象,就可以放到老年区。一般来说,刚才产生的对象大多是要在下一次垃圾回收的时候就要被回收掉的,只有一小部分对象会被保留下来,这些被保留下来的对象都是比较稳定的,所以在老年区中的对象回收方法可以采用整理的方法,而在Edon区等新生代中采用复制的方法比较好。
垃圾回收他是在虚拟机空闲的时候或者内存紧张的时候执行的,什么时候回收不是由程序员来控制的,这也就是java比较耗内存的原因之一。 还有在垃圾回收的时候当检测到对象没有用了,需要被回收的时候并不会马上被回收,而是将其放入到一个准备回收的队列,去执行finalize方法。。 参考技术A 不会,当你清空Javamap时,只是释放了其中的所有条目,但并不会影响整个内存的大小。 参考技术B 不会。清空javamap后,它只是将其中所有的键值对都删除,但内存大小不会改变。
linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?
当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源。包括这个进程分配的内存,打开的文件等等。
内存泄露的前提是进程一直在运行;进程一旦退出,所占的整个虚拟内存都被销毁,所有内存资源都会被系统回收。
参考文章:linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放??…
以上是关于javamap清空后内存会变小吗的主要内容,如果未能解决你的问题,请参考以下文章