首页 > 试题广场 >

Java中垃圾回收有什么目的?什么时候进行垃圾回收?

[问答题]
Java中垃圾回收有什么目的?什么时候进行垃圾回收?
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源
触发主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 回复(3)
目的:回收堆内存中不再使用的对象,释放资源
回收时间:当对象永久地失去引用后,系统会在合适的时候回收它所占的内存
发表于 2016-03-17 16:31:41 回复(0)
垃圾回收目的是回收堆中已经不再被使用的对象。垃圾回收线程是一个守护线程,优先级低,其在当前服务器空闲或堆中老年代等占用率较大时触发。
发表于 2015-11-07 19:31:59 回复(1)
目的:
识别并且丢弃应用不再使用的对象来释放和重用资源。
触发条件:(1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
                  (2)Java堆内存不足时,GC会被调用。
发表于 2017-03-27 15:00:16 回复(0)
目的:

清除掉不再使用,但是仍旧占用内存的对象。

发表于 2020-02-05 11:49:04 回复(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)
仅提供一个大致的思路:
垃圾回收(gc)的目的是释放堆中不需要保存的对象,达到内存的充分利用。

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

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

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

编辑于 2017-07-30 16:50:19 回复(1)
  • 垃圾回收的目的

    回收没有用的对象,清理出更多的内存

  • 什么时候进行垃圾回收

    1. 代码中主动调用垃圾回收System.gc()

    2. Java堆无法扩展并且无法为对象分配足够的空间时,会自动进行回收

    3. 当应用程序空闲时,即没有应用线程在运行时,GC会被调用(GC线程优先级别低)

发表于 2020-10-19 12:03:12 回复(0)
垃圾回收目的:将堆内存中没有引用指向的对象,识别并且丢弃,释放资源。
垃圾什么时候回收:1.在应用程序空闲时,没有应用线程访问时,GC会被调用
                                  2.在堆内存满时,GC会被调用
发表于 2020-09-02 16:04:29 回复(0)
垃圾回收的目的是回收堆内存中不再使用的对象所占的内存,释放资源。
回收时间:即触发GC的时间,在新生代的Eden区满了,会触发新生代GC(Mimor GC),经过多次触发新生代GC存活下来的对象就会升级到老年代,升级到老年代的对象所需的内存大于老年代剩余的内存,则会触发老年代GC(Full GC)。当程序调用System.gc()时也会触发Full GC。
发表于 2020-07-03 21:34:01 回复(0)

目的是回收不再引用或者超过作用范围的变量,从而释放内存。在java空闲时或者堆内存不足时调用gc。

发表于 2020-03-02 21:50:52 回复(0)
识别并丢弃堆中不再使用或超出作用域的对象 ,达到释放或重用资源(内存)
编辑于 2019-11-21 23:50:06 回复(0)
gc,通过system.gc()主动调用runtime. gc
编辑于 2019-10-25 16:54:42 回复(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)