当前位置: 首页 > 图灵资讯 > 技术篇> Garbage Collection 一直在执行? 还是需要时才启动?

Garbage Collection 一直在执行? 还是需要时才启动?

来源:图灵教育
时间:2024-02-22 14:37:07

  内存对於 Java 它通常是一种非常珍贵的资源,尽管现在的内存非常便宜,随便几百 MB 但是几千块台币,但是如果能掌握一些记忆状态,就不会写了 memory monster 程式,我想,如果你用的话, J2ME 或者周围没有足够的内存,那么我想你可以深刻地理解这句话的意思。

  而且 Java 我们必须再次提到内存 Garbage Collection ,事实上,很多人可能会认为 Garbage Collection 只有在需要的时候才能实施,其实并非如此,需要记住的是 Garbage Collection (以下简称 GC) 这是另一个执行线在执行中的动作,也就是说,当你执行程式时,实际上 GC 一直在监测当前的各种情况。 要理解这一点,我们可以先从 java (java.exe) 下手的参数。

  当我们下手的时候。 java -help 之后,就可以看到了 -verbose[:class |gc|jni] 这个参数,是的,这个参数可以让我们看到更详细的情况。首先,我写了下面的程序 public class testGC { public static void main(String argv[]) { StringBuffer sb = new StringBuffer(); int MAX=Integer.parseInt(argv[0]); for(int i = 0 ; i <=MAX ; i++) { sb.append("test").append(i).append("test"); if(i % (MAX/2)== 0) { System.out.println("===Starting System.gc()==="); System.gc(); System.out.println("===Finishing System.gc()==="); } } } } 在 Compile 结束之後,我直接用 java testGC 20000,结果如下: C:\java\tmp> java testGC 20000 ===Starting System.gc()=== ===Finishing System.gc()=== ===Starting System.gc()=== ===Finishing System.gc()=== ===Starting System.gc()=== ===Finishing System.gc()=== 但现在我们添加了另一个参数 -verbose:gc ,让命令列成为 java -verbose:gc testGC 20000 结果如下: C:\java\tmp> java -verbose:gc testGC 20000 ===Starting System.gc()=== [GC[0: 367K-> 190K(1984K): 190K-> 190K(1984K) 0.0454848 secs] ===Finishing System.gc()=== [GC[0: 1206K-> 694K(1984K), 0.0009384 secs] ===Starting System.gc()=== [GC[0: 879K-> [1984K]694K(1984K): 694K-> 478K(1984K) 0.0336423 secs] ===Finishing System.gc()=== [GC[0: 1565K-> 1054K(1984K) 0.0006216 secs] ===Starting System.gc()=== [GC[0: 1167K-> 1054K(1984K): 1054K-> 766K(1984K), 0.0375078 secs] ===Finishing System.gc()=== 以 [ 开头, ] 结尾的是 GC 实施情况确实表示,在 System.gc() 之后,他执行了。我们可以看到他均匀地插入了我们的每一行输出中间。没关系。我们将参数从 20000 调到 50000,再执行一次,结果如下 C:\java\tmp> java -verbose:gc testGC 50000 ===Starting System.gc()=== [GC[0: 367K-> 190K(1984K): 190K-> 190K(1984K) 0.0457804 secs] ===Finishing System.gc()=== [GC[0: 1206K-> 694K(1984K), 0.0009297 secs] [GC[0: 1782K-> 1270K(1984K), 0.0005685 secs] [GC[0: 1782K-> 1270K(1984K), 0.0006135 secs] [GC[1: 1277K-> 766K(1984K), 0.0353595 secs] ===Starting System.gc()=== [GC[0: 2009K-> 1918K(3140K)[1: 1918K-> 1342K(3140K) 0.0435416 secs] ===Finishing System.gc()=== [GC[0: 1853K-> 1342K(3140K) 0.0005931 secs] [GC[0: 1854K-> 1342K(3140K) 0.0006395 secs] [GC[1: 1644K-> 1341K(3140K) 0.0480494 secs] ===Starting System.gc()=== [GC[0: 3881K-> 3645K(5448K)[1: 3645K-> 2493K(5448K), 0.0462025 secs] ===Finishing System.gc()=== 这个时候很明显,你会发现,即使不执行, System.gc(); 也会看到 [GC 开头的字眼,这意味着 GC 当前情况将随时监测。