黑马程序员技术交流社区

标题: Java的垃圾回收与内存问题 [打印本页]

作者: 魏-玉-彪    时间: 2012-9-2 07:58
标题: Java的垃圾回收与内存问题
请问Java的垃圾回收时是否占用内存?占用多少?虚拟机是怎样保证在内存耗尽之前启动Java的垃圾回收机制的?
作者: 郑义    时间: 2012-9-2 08:09
我认为垃圾回收也肯定会占用内存的吧,毕竟垃圾回收也是在执行一个程序,当执行完成之后这个垃圾回收程序也是会释放的。
至于你说的占用多少内存,这个问题还请高人指点。
还有你说虚拟机是怎样保证在内存耗尽之前启动Java的垃圾回收机制的。
虚拟机并不是在内存将近耗尽之前才启动垃圾回收机制,而是有几个条件才会启动垃圾回收机制的:
1.系统比较空闲(垃圾回收线程)
2.对象不在被引用.对象处于引用的隔离状态(隔离引用),对象具备了回收的条件
3.gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收。
作者: 孙沛    时间: 2012-9-2 08:30
我给你讲讲垃圾回收机制吧。
Java解释器在为一个实例对象分配完存储空间后,便开始记录该实例对象所占用的内存空间的使用,直至使用完毕便将其回收。 在Java的运行过程中,一个垃圾回收器会不定时的被唤醒来检查是否有不再被使用的对象,并释放它们占用的内存空间。垃圾回收器的启用不由程序员控制,无规律可循。
        不同Java虚拟机有不同的垃圾回收机制,一般有两种比较常用:复制式回收机制和“自省式”回收机制。
        复制式回收机制:这种策略的执行模式是现将正在运行的程序暂停,然后把正在被使用的所有对象复制一份到另一块堆内存中,那些         不再被使用的对象所占的内存空间被释放。此方式需要的内存空间是所需维护的两倍,而且当程序只产生了少量甚至没有垃圾时,就会导致效率低下。
        自省式回收机制:检测所有正在使用的对象,并为他们标注,完成这项工作后再将所有不再被使用的对象所占据的内存空间一次释放掉。尽管此种方式速度很慢,但在只有少量的垃圾或者没有垃圾时,就极具优势。
        这两种方式颇具互补性,所以在一些JVM中结合的运用。如果程序中的对象长期的使用,JVM就换至“自省式”,而当产生大量垃圾或所占的内存不连续情况严重时,又会换至“复制式”。
        所以你不需要担心虚拟机内存耗尽之前启动Java的垃圾回收机制。
        Java的垃圾回收时是否占用内存?占用多少?这个肯定是占用内存的,看第一种复制式回收机制。,内存占用是所需维护的两倍。
作者: 乔九    时间: 2012-9-2 09:34
浅谈一下Java的垃圾回收
java用new创建一个对象并没有对应的delete来回收,当一个对象不再被使用的时候他所使用的堆空间将被收回以便给后面的对象使用,垃圾收集器必须能判定那些对象是不再被引用的,并且能够把他们所占据的堆空间释放出来。在释放不再被引用的对象过程中收集器主动运行释放对象终结方法(finalizer).所以垃圾回收是要占用内存的,同时保证内存不会被完全占用。至于要回收是占用多少这个不固定吧。
作者: 孙鑫    时间: 2012-9-2 09:43
程序员需要通过关键字new创建java对象,即可视为java对象申请内存空间,JVM会再堆内存中为每个对象分配空间,当一个java对象失去引用时JVM的垃圾回收机制会自动清除它们,并回收它们所占用的内存空间。
①当应用程序空闲时,即没有应用线程在运行时,GC(Garbage Collector)会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
②Java堆内存不足时,GC(Garbage Collector)会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。
由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。



作者: 魏-玉-彪    时间: 2012-9-4 07:19
此问题已解决

谢谢各位大侠,本问题基本解决,我将继续关注关于内存的原理。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2