garbage collection

   sun垃圾回收学习

  sun的垃圾回收器采用了分代收集器,所谓的分代收集器是把堆分为多个不同的区,根据对象的寿命分别存放,过一段时间继续存在的对象将获得试用期和更长寿命的域,分代收集器对不同的域使用不同的算法进行优化。

  HotSpot把堆分为新域(Eden、两个Survivor Space)、旧域(old generation,tenued)、和永久域(permanent generation),对young generation使用较高频率回收的minor collection,对于old generation使用major collection回收,以上是两种内存收集方式,sun内存收集方式,复制收集即将所有生存的对象搬到另一内存区域,原区域内存被回收,这种方式效率比较高,但是复制需要开销,并且需要额外内存,适用于minor  collection,另一种则mark_compact标记压缩,将存活的对象标记出来,然后搬迁到一起连成大块的内存,其他内存就可以回收了,不需要占用额外的空间,但速度相对慢一些适用于major collection。

  young generation,Eden用于存放生成的一个新的对象,另外的Survivor Space区属于救助区,当Eden区满时,会将当前Eden区复制到另外的两个Survivor Space区,且成为a区和b区,Eden区满------a区/b区,a/b区满-----a/b区,a和b区相互救助,经过一段时间,具体经过多少次的gc频率可以通过-XX:+MaxTenuringThreshold设置,其直接或者n次后进入old generation区,当年轻区满时注意不是指Eden区满时,会触发minor collection,在新区中使用复制收集器,是很合理的因为程序中大多数对象都是短寿命的,理论上可以把Eden区满时,对象复制到年老区,避免救助区来回的复制,但是在实际中的总会有中长寿命对象,对这些对象的标记压缩回收是很昂贵的,所以需要救助区的存在。

  old generation,tenued区,当该区满时会进行major collection,Permanent generation区,是永久区存放class object和method,当该区满时会进行full gc.

  下面是一些收集的常见配置参数:

   java -Xms 128m -Xmx128m -XNewRatio=4 -XNewSize32m -XMaxNewSize32m      **调整堆内存最大128最小128新域在堆域所占比为1:4,新域的大小32m

   java -XX:PerSize32m -XX:MaxPerSize32m    **设置永久域的初始值和最大值,默认4m,当永久域满时会进行一次完整的垃圾回收即做full gc

   java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2 **调整堆内村最大最小256,新域64m,按照新域比例的二分之一,救助区分别为两个16m

垃圾收集(Garbage Collection)是一种自动内存管理机制,即自动回收不再使用的内存空间。在Python中,垃圾收集器通过搜索对象,并查找引用计数为0的对象来找到要回收的内存空间。 以下是Python中垃圾收集器的一些概念和过程[^1]: - 引用计数:当一个对象被创建时,它的引用计数被设置为1,当有一个新的变量引用它时,它的引用计数会增加1,当这个引用变量被删除时,它的引用计数就会减1。当引用计数为0时,该对象不再被引用,就会被垃圾收集器回收。 - 标记-清除:Python的垃圾收集器通过标记-清除算法来回收内存。在这个过程中,垃圾收集器会首先标记所有被引用的对象,然后清除所有未被标记的对象。在清除这些未标记对象时,并将它们的内存释放回内存池。 - 引用循环:引用循环是指两个或两个以上的对象相互引用,这种情况下它们的引用计数永远不会降为0,因此不会被垃圾收集器回收。Python使用“标记-清除”和“分代回收”机制来处理这种情况。 - 分代回收:分代回收是指Python中垃圾收集器将内存分成不同的代,每个代都有一个垃圾回收阈值。新创建的对象会被放置在第0代,当第0代的垃圾回收阈值达到时,升到第1代。当第1代的垃圾回收阈值达到时,升到第2代,以此类推。 以下是一个Python程序,展示了垃圾收集的过程: ```python import gc import sys a = [1, 2, 3] print(sys.getrefcount(a)) # 输出:2 b = [4, 5, 6] a.append(b) b.append(a) print(gc.get_count()) # 输出:(0, 0, 0) del a del b print(gc.get_count()) # 输出:(3, 0, 0) gc.collect() print(gc.get_count()) # 输出:(0, 0, 0) ``` 上述程序中,当a和b中的所有变量被删除后,使用gc.collect()方法可以触发垃圾收集器回收内存,输出gc.get_count()的结果为(0, 0, 0)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值