java lang的system_Java.lang.System.gc() 工作原理 以及一些疑问

Java System.gc()工作原理?

JVM虚拟机何时真真正正的进行垃圾回收工作?

首先JDK5的API:

7970f5bf6ffe42d5fcbc463f342d2df0.gif

当调用System.gc()方法后系统运行垃圾回收器,调用gc()方法来建议JVM努力回收没有使用的对象内存,为了使它们占用的内存腾出来让别的对象快速使用。当调用完该方法后,JVM会尽它最大努力从所有不再使用(销毁)的对象中回收内存空间。

System.gc() 与 Runtime.getRuntime().gc()功能相同。

其实我们调用垃圾回收器进行回收的时候,JVM并不一定去真的回收,因为该方法只是建议与提醒JVM该回收了,JVM到底做与不做由它自身说了算。

最典型的例证是你将AWT或者Swing窗口dispose()掉,然后调用System.gc()回收,而后再调用show()仍能恢复到dispose前的窗口状态,也就是System.gc()根本就没有回收资源。

那么JVM到底什么时候真真正正的去回收垃圾呢?我做如下例子:

public static void main(String[] args) {

boolean flag = true;

int i = 0;

while(flag){

Window1 window = new Window1();

window.setVisible(true);

if(i == 999){

flag = false;

}

i++;

window.dispose();

double total = Runtime.getRuntime().totalMemory();

double free = Runtime.getRuntime().freeMemory();

System.out.println("No." + i +

" 可用内存: " + total +

" 剩余内存 : " + + free +

" 使用内存所占百分比: " + getP(total, free));

}

}

public static String getP(double a, double b){

double p3 = (a - b)/a;

NumberFormat nf = NumberFormat.getPercentInstance();

nf.setMinimumFractionDigits( 1 );

return nf.format(p3);

}

我这里进行1000次循环生成新的窗口和dispose()掉,观察内存占用情况,由于结果数据量较大,我就取其中比较典型的几个节点:

No.1 可用内存: 2031616.0 剩余内存 : 1591960.0 使用内存所占百分比: 21.6%

No.49 可用内存: 2031616.0 剩余内存 : 1091360.0 使用内存所占百分比: 46.3%

No.50 可用内存: 2031616.0 剩余内存 : 1077392.0 使用内存所占百分比: 47.0%

No.51 可用内存: 2031616.0 剩余内存 : 1062864.0 使用内存所占百分比: 47.7%

No.52 可用内存: 2031616.0 剩余内存 : 1410248.0 使用内存所占百分比: 30.6%

No.53 可用内存: 2031616.0 剩余内存 : 1397608.0 使用内存所占百分比: 31.2%

No.136 可用内存: 2031616.0 剩余内存 : 781512.0 使用内存所占百分比: 61.5%

No.137 可用内存: 2031616.0 剩余内存 : 769336.0 使用内存所占百分比: 62.1%

No.138 可用内存: 2031616.0 剩余内存 : 1136664.0 使用内存所占百分比: 44.1%

No.139 可用内存: 2031616.0 剩余内存 : 1130232.0 使用内存所占百分比: 44.4%

No.222 可用内存: 2031616.0 剩余内存 : 515064.0 使用内存所占百分比: 74.6%

No.223 可用内存: 2031616.0 剩余内存 : 500168.0 使用内存所占百分比: 75.4%

No.224 可用内存: 2031616.0 剩余内存 : 880504.0 使用内存所占百分比: 56.7%

No.225 可用内存: 2031616.0 剩余内存 : 864384.0 使用内存所占百分比: 57.5%

No.265 可用内存: 2031616.0 剩余内存 : 380600.0 使用内存所占百分比: 81.3%

No.266 可用内存: 2031616.0 剩余内存 : 368312.0 使用内存所占百分比: 81.9%

No.267 可用内存: 2031616.0 剩余内存 : 737640.0 使用内存所占百分比: 63.7%

No.268 可用内存: 2031616.0 剩余内存 : 721600.0 使用内存所占百分比: 64.5%

No.700 可用内存: 3051520.0 剩余内存 : 123256.0 使用内存所占百分比: 96.0%

No.701 可用内存: 3051520.0 剩余内存 : 111208.0 使用内存所占百分比: 96.4%

No.702 可用内存: 3776512.0 剩余内存 : 1843352.0 使用内存所占百分比: 51.2%

No.703 可用内存: 3776512.0 剩余内存 : 1831856.0 使用内存所占百分比: 51.5%

No.1000 可用内存: 3776512.0 剩余内存 : 610536.0 使用内存所占百分比: 83.8%

这里内存占用最高的是NO.701,达到96.4%,然后就急转直下到51.2%,其它典型节点的变化也是如此,从上面数据可以大致分析出JVM垃圾回收器的工作时间出发点应该是内存到达影响JVM后续工作的时候,它才会自动去执行垃圾回收操作。而根本就不需要我们去担心,我不知道JVM引擎是如何工作的,但是可以肯定的是JVM的智能程度要比C++强大的多,这也充分体现了Java的简单性。

本人: 1》 对于JVM的智能程度比C++强大的这个问题,我认为二者不能同位而语。前者只是一个在C/C++ Runtime中

运行Java程序而设计的虚拟机,而后者是一种语言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值