关闭

java垃圾回收那点事(一) System.gc开始说起

13872人阅读 评论(0) 收藏 举报
分类:

java提供了从语言角度能够强制jvm进行垃圾回收,在我们的程序中可以通过调用System.gc去强制jvm进行垃圾回收,通过源码我们可以看到实际上是调用了Runtime去强制gc

public static void gc() {
	Runtime.getRuntime().gc();
    }

Runtime的gc方法是native方法也就是Rumtime.c中的

JNIEXPORT void JNICALL
Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
{
    JVM_GC();
}

而JVM_GC方法是在jvm.cpp中实现

JVM_ENTRY_NO_ENV(void, JVM_GC(void))
  JVMWrapper("JVM_GC");
  if (!DisableExplicitGC) {
    Universe::heap()->collect(GCCause::_java_lang_system_gc);
  }
JVM_END

我们看到参数DisableExplicitGC,从代码中可以使用-XX:+DisableExplicitGC 可以关闭system,gc

对universe:heap() -> Universe::_collectedHeap 是在初始化的时候决定使用什么类型的heap,也决定了使用什么gc的策略,也就是说java heap的分配方式是在java启动的时候就决定的,无法中间更改,同样对应的gc策略也无法更改

if (UseParallelGC) {
#ifndef SERIALGC
    Universe::_collectedHeap = new ParallelScavengeHeap();
#else  // SERIALGC
    fatal("UseParallelGC not supported in java kernel vm.");
#endif // SERIALGC

  } else if (UseG1GC) {
#ifndef SERIALGC
    G1CollectorPolicy* g1p = new G1CollectorPolicy_BestRegionsFirst();
    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
    Universe::_collectedHeap = g1h;
#else  // SERIALGC
    fatal("UseG1GC not supported in java kernel vm.");
#endif // SERIALGC

  } else {
    GenCollectorPolicy *gc_policy;

    if (UseSerialGC) {
      gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
#ifndef SERIALGC
      if (UseAdaptiveSizePolicy) {
        gc_policy = new ASConcurrentMarkSweepPolicy();
      } else {
        gc_policy = new ConcurrentMarkSweepPolicy();
      }
#else   // SERIALGC
    fatal("UseConcMarkSweepGC not supported in java kernel vm.");
#endif // SERIALGC
    } else { // default old generation
      gc_policy = new MarkSweepPolicy();
    }

    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
  }
从源码中我们可以看到

Parallel GC 是用的是ParallelScavengeHeap, 

CMS 使用的是 GenCollectdHeap 

G1使用的是G1CollectedHeap

1
0
查看评论

调用System.gc没有立即执行的解决方法

查看源码当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到 /** * Indicates to the VM that it would be a good time to run the * garbag...
  • yewei02538
  • yewei02538
  • 2016-08-31 16:49
  • 3870

浅谈Java中的System.gc()的工作原理

趁着今天写程序的热乎劲儿,小谈一下System.gc()这个神秘的东东~<br /><br />很多人把Java的“效率低下”归咎于不能自由管理内存,但我们也知道将内存管理封装起来的好处,这里就不赘述。<br /><br />Java中的内存分配是随着...
  • huxin1
  • huxin1
  • 2010-10-11 11:05
  • 40615

System.gc(); 与Runtime.gc()的区别

(1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。(2) ...
  • TimMobile
  • TimMobile
  • 2015-10-27 19:37
  • 4043

System.gc和System.runFinalization区别

System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 new Chair();           System.gc(); 这个不一定会执行Chair对象的finalize方法...
  • qq_36291682
  • qq_36291682
  • 2016-12-04 18:40
  • 448

System.gc()

转自 http://win.sy.blog.163.com/blog/static/94197186201151093543556/ 1.垃圾收集算法的核心思想   Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态...
  • wre_most2
  • wre_most2
  • 2013-02-26 10:10
  • 1103

System.gc()和System.runFinalization()

//垃圾回收  System.gc();  System.runFinalization(); runFinalization public static void runFinalization() 运行处于挂起终止状态的所有对象...
  • u014086926
  • u014086926
  • 2016-08-05 20:07
  • 1126

如何禁用System.gc()

默认情况下,System.gc()会显式直接触发Full GC,同时对老年代和新生代进行回收。而一般情况下我们认为,垃圾回收应该是自动进行的,无需手工触发。如果过于频繁地触发垃圾回收对系统性能是没有好处的。因此虚拟机提供了一个参数DisableExplicitGC来控制是否手工触发GC。 Sy...
  • kangbin825
  • kangbin825
  • 2017-04-11 18:33
  • 354

调用System.gc没有立即执行

原文链接http://www.weyye.me/detail/System-gc-not-called/ 查看源码 当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到 1234567891011121314...
  • QW121301152358
  • QW121301152358
  • 2016-09-01 08:12
  • 1277

java垃圾回收与System.gc()介绍

java垃圾回收与System.gc()介绍 1.垃圾收集算法的核心思想   Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。 ...
  • jiyiqini
  • jiyiqini
  • 2015-07-02 13:54
  • 5702

Android System.gc()注意点

背景在看square Leakcanary源码时,提到用Runtime.getRuntime().gc()比直接调用System.gc()更容易触发gc,为什么呢?
  • fearGod
  • fearGod
  • 2015-06-04 17:18
  • 7876
    个人资料
    • 访问:500753次
    • 积分:5449
    • 等级:
    • 排名:第5872名
    • 原创:100篇
    • 转载:3篇
    • 译文:0篇
    • 评论:73条
    最新评论