调用System.gc没有立即执行

原文链接http://www.weyye.me/detail/System-gc-not-called/

查看源码

当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到

     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     
     
/**
* Indicates to the VM that it would be a good time to run the
* garbage collector. Note that this is a hint only. There is no guarantee
* that the garbage collector will actually be run.
*/
public static void gc() {
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = justRanFinalization;
if (shouldRunGC) {
justRanFinalization = false;
} else {
runGC = true;
}
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
}

也就是justRanFinalization=true的时候才会执行

查找发现当调用runFinalization()的时候justRanFinalization变为true
下面是runFinalization()的源码

     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     
     
/**
* Provides a hint to the VM that it would be useful to attempt
* to perform any outstanding object finalization.
*/
public static void runFinalization() {
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = runGC;
runGC = false;
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
Runtime.getRuntime().runFinalization();
synchronized(lock) {
justRanFinalization = true;
}
}

其实当我们直接调用System.gc()只会把这次gc请求记录下来,等到runFinalization=true的时候才会先去执行GC,runFinalization=true之后会在允许一次system.gc()。之后在call System.gc()还会重复上面的行为。
所以System.gc()要跟System.runFinalization()一起搭配使用才好。
查看ZygoteInit.java 里面 gc()和runFinalizationSync()是配合使用的,这样才有效果

     
     
1
2
3
4
5
6
7
8
9
10
     
     
static void gcAndFinalize() {
final VMRuntime runtime = VMRuntime.getRuntime();
/* runFinalizationSync() lets finalizers be called in Zygote,
* which doesn't have a HeapWorker thread.
*/
System.gc();
runtime.runFinalizationSync();
System.gc();
}

解决方案

由此可见,当我们需要调用的System.gc()的时候 要这样才会执行

     
     
1
2
3
     
     
System.gc();
runtime.runFinalizationSync();
System.gc();

不过个人建议不到万不得已不要调用,因为jvm有自己的gc策略,根本不需要我们来手动

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `System.gc()` 是 Java 程序中的一个方法,它是在 Java 的 `java.lang` 包中的。这个方法的作用是请求 JVM 进行垃圾回收,但并不保证 JVM 一定会立即回收垃圾。它只是一个建议,由 JVM 决定是否执行回收操作。实际上,现代的 JVM 实现已经很智能,不需要开发人员明确地调用此方法来进行垃圾回收。 ### 回答2: System.gc();是Java中的一个方法调用,用于显示地触发垃圾回收。垃圾回收是Java虚拟机在运行时自动管理内存的一种机制,它负责自动回收不再被使用的对象的内存空间。当程序运行时,创建了一些对象,并且这些对象不再被引用时,Java虚拟机会自动回收这些对象所占用的内存空间,释放资源,这个过程就是垃圾回收。 而System.gc()方法的作用就是显式地调用垃圾回收器。虽然Java虚拟机会根据自身的策略自动触发垃圾回收,但是我们也可以通过调用System.gc()方法来建议虚拟机执行垃圾回收操作。调用System.gc()并不是立即执行垃圾回收,而是向垃圾回收器发送一个请求,告诉它有待回收的对象可以进行回收。 需要注意的是,System.gc()方法的调用并不会立即释放所有内存,也不能保证垃圾回收一定会执行。垃圾回收的具体执行时间是由JVM决定的,而且该方法的执行会造成一定的性能损失。因此,在编写代码时,我们不应该过分依赖于System.gc(),而是应该编写良好的代码结构和逻辑,避免出现内存泄漏等问题。 总之,System.gc()方法是用来手动触发垃圾回收的,它向垃圾回收器发送一个请求,告诉它有待回收的对象可以进行回收。但是需要注意的是,调用System.gc()并不能保证垃圾回收一定会执行,也不能立即释放所有内存,因此在编写代码时应该合理使用,不过度依赖于该方法。 ### 回答3: System.gc()是Java中的一个方法,用于显式地请求垃圾回收器进行垃圾回收。 在Java中,垃圾回收器负责自动回收不再使用的内存,释放掉这些内存供其他程序使用,从而避免了内存泄漏的问题。系统会自动进行垃圾回收,但是我们也可以使用System.gc()方法来主动触发垃圾回收。 当我们调用System.gc()方法时,会向JVM发送一个垃圾回收的请求,但是具体是否立即进行垃圾回收以及回收的效果,取决于JVM的实现。 值得注意的是,尽管我们可以调用System.gc()方法来主动触发垃圾回收,但是这并不意味着每次调用都会导致垃圾回收的立即执行。实际上,JVM会根据自身的策略和算法来决定何时进行垃圾回收,以及要回收多少的内存。 在一般情况下,我们并不需要手动调用System.gc()方法,因为JVM能够根据需要自动进行垃圾回收。只有在某些特殊情况下,比如我们需要尽快回收大量的内存时,可能会使用System.gc()方法来主动触发垃圾回收。 总之,System.gc()方法是Java中一个用于主动触发垃圾回收的方法。但是我们要注意,不要滥用这个方法,因为JVM能够自动进行垃圾回收,并且过多地调用System.gc()方法可能会影响程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值