首页 > 试题广场 > Java中垃圾回收有什么目的?什么时候进行垃圾回收?
[问答题]
Java中垃圾回收有什么目的?什么时候进行垃圾回收?

36个回答

添加回答
目的:回收堆内存中不再使用的对象,释放资源
回收时间:当对象永久地失去引用后,系统会在合适的时候回收它所占的内存
发表于 2016-03-17 16:31:41 回复(0)
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源
触发主GC(Garbage Collector,垃圾回收)的条件:
(1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
(2)Java堆内存不足时,GC会被调用。
发表于 2016-07-24 16:54:01 回复(0)
垃圾回收的目的是回收堆内存中不再使用的对象所占的内存,释放资源。
回收时间:即触发GC的时间,在新生代的Eden区满了,会触发新生代GC(Mimor GC),经过多次触发新生代GC存活下来的对象就会升级到老年代,升级到老年代的对象所需的内存大于老年代剩余的内存,则会触发老年代GC(Full GC)。当程序调用System.gc()时也会触发Full GC。
编辑于 2017-01-09 16:18:59 回复(2)
仅提供一个大致的思路:
垃圾回收(gc)的目的是释放堆中不需要保存的对象,达到内存的充分利用。

1.回收哪些对象的判定
垃圾回收最简单的思路是采用引用计数的方式,即记录对象被引用的次数,直到一段时间内对象都没有被其他对象引用,此时可以确定该对象能被回收,引用计数实现简单,运行高效,但是有一个循环引用的问题,即两个本应被回收的对象因为互相引用而无法被回收,针对这个问题又有了弱引用,即把两个互相引用的一个引用计数改为弱引用,弱引用不会使次数加1,c++即是这么做的。

jvm虚拟机的使用的是根寻路算法,其大致思想是看除堆区以外的内存区域能否通过引用链找到堆中的对象,找不到就证明该对象可以被回收。
2.如何回收
jvm有两种回收方式,一种是标记完待回收的对象之后一起释放内存,这种方法的缺点是会产生较多难以重复利用的内存碎片。另一种为了避免内存碎片的出现,将内存分为两块,一块使用,一块不使用,标记完所有待回收的对象之后,将还要使用的内存复制到不使用的区域,然后对使用的整体区域进行内存回收,这种方法没有内存碎片问题,但是每次回收的复制工作很耗性能。
通过统计发现,在内存中存活越久的对象就越不容易被回收,越是新分配的内存对象就越可能会被回收。根据这个特性,把内存区域分为新生代和老年代(有的虚拟机会分为很多代),新生代容易被回收,采用复制内存再回收的方法,老年代不容易被回收,采用标记后回收和复制内存相结合的方法。
3.什么时候回收

程序员可以手动调用gc,一般是系统等到新生代的内存区占满了又需要分配内存的时候,这个时候新生代就变成了老年代,等老年代的内存占满之后开始回收老年代所占的内存区。

编辑于 2017-07-30 16:50:19 回复(0)
垃圾回收目的是回收堆中已经不再被使用的对象。垃圾回收线程是一个守护线程,优先级低,其在当前服务器空闲或堆中老年代等占用率较大时触发。
发表于 2015-11-07 19:31:59 回复(1)
目的:
识别并且丢弃应用不再使用的对象来释放和重用资源。
触发条件:(1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
                  (2)Java堆内存不足时,GC会被调用。
发表于 2017-03-27 15:00:16 回复(0)
回收的目的:是为更好的释放和管理内存。
回收的时间:要根据垃圾回收机制的两种说法(引用计算法)(根搜索算法)但是引用计数法是不准确有漏洞的因为当两个已经死亡的对象之间有相互引用,这样就不会回收会浪费内存;所以根搜索算法更加准确因为根搜索算法是从一个GC ROOT作为起点往下搜索,搜索的路径是引用链,当一个对象无法通过引用链叨叨GC RROT时候就可以判断该对象可以回收了。
发表于 2018-08-30 11:07:09 回复(0)
垃圾回收机制的要点:
1.垃圾回收线程是一个守护线程(指在程序运行的时候在后台提供一种通用服务的线程)
2.程序员可以主动申请垃圾回收,使用代码System.gc();但是由于垃圾回收是由JVM负责的,因此请求可能被JVM可以拒绝。
3.垃圾回收器的分类:串行垃圾回收器,并行垃圾回收器,G1垃圾回收器
4.回收机制:分代复制垃圾回收,增量回收
5.作用:防止内存泄漏。
   当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用 情况。通常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式 确定哪些对象是"可达的",哪些对象是"不可达的"。当 GC 确定一些对象为"不可达" 时,GC 就有责任回收这些内存空间。这可以有效的防止内存溢出。
   内存溢出是指:长生命周期的对象持有短生命周期的对象的引用,这会导致短生命周期的对象的所占堆内存无法被释放。
①比如把一些不怎么使用的对象存放到全局Map中,
②或者创建了内部类对象,而其外部类即使长时间没有使用也不能释放其内存空间。
发表于 2017-10-13 10:59:51 回复(0)
目的:回收堆内存中不再使用的对象,释放资源
回收时间:当对象永久地失去引用后,系统会在合适的时候回收它所占的内存
垃圾回收的目的是回收堆中已经不在被使用的对象。垃圾回收机制是一个守护线程,优先级别低,其在当前服务器空闲或堆中老年代等占用率较大时触发。
发表于 2016-10-09 21:38:39 回复(0)
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。 垃圾回收是在内存中存在没有引用的对象或者超过作用域的对象时进行。
编辑于 2019-05-07 00:08:15 回复(0)
目的:回收堆内存中不再使用的对象,释放资源 回收时间:当对象永久地失去引用后,系统会在合适的时候回收它所占的内存
发表于 2019-04-30 22:24:40 回复(0)


垃圾回收是在内存中存在没有引用的对象或超过作用域的对象进行垃圾回收
回收的目的是识别并且丢弃应用不在使用的对象来释放和重用资源
发表于 2019-04-28 16:48:38 回复(0)
垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行。
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
发表于 2019-04-27 21:04:00 回复(0)
垃圾回收的目的:丢弃应用不用的对象来释放重用资源。
发表于 2019-04-26 22:46:35 回复(0)

垃圾回收:是内存中存在没有引用的对象或超出作用域对象时进行

目的是识别并丢弃应用不再使用的对象来释放资源

发表于 2019-04-26 22:30:00 回复(0)
垃圾回收器的作用是查找和回收(清理)无用的对象。以便让JVM更有效的使用内存。 垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。虽然可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证JVM会立即响应执行,但经验表明,下达命令后,会在短期内执行的请求。JVM通常会感到内存紧缺时候去执行垃圾回收操作。
发表于 2019-04-26 21:38:59 回复(0)
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
发表于 2019-04-25 21:05:27 回复(0)
垃圾回收目的是通过引入了垃圾回收机制,写程序的时候不再需要考虑内存管理也可以有效的防止内存泄露,有效的使用空闲的内存。
发表于 2019-04-25 19:50:11 回复(0)
回收释放无用内存(系统判断不可达或长时间不用内存),使内存可以循环使用,防止发生内存的大量消耗。触发条件是年轻代edent不够用或老年代内存不够用(不是满的也是)或调用了system.gc()。
编辑于 2018-11-10 12:21:47 回复(0)
GC回收的目的在于回收那些不被引用关联的对象,释放资源
GC回收的时间:
1.程序运行System.gc();方式提醒JVM进行gc
2.Eden伊甸园内存空间紧张的时候
3.GC整体空间紧张的时候,JVM停止所有线程,执行Full GC
发表于 2018-09-17 16:09:12 回复(0)