16行代码展现java内存处理的bug

测试环境:

java version "1.7.0_45"

Java(TM) SE Runtime Environment (build 1.7.0_45-b18)

Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

A.java:

class A{
        public int i = 0;
        protected void finalize()throws Throwable{
                System.out.println("it is "+i);
        }
}
Test.java:

class Test{
        public static void main(String [] args){
                A a = new A();
                for(int i=0;i<900000000;i++){
                        a=new A();
                        a.i=i;
                }
                System.out.println("is end!!");
        }
}


刚开始运行的时候一下子输出一长串的 "it is i";到i的值到达1400000之后程序变得非常缓慢。最终还没有执行到输出“is end” 就被终止了。

而且,在后边输出"it is i" 的间隙有抛出一些异常。

中途一段时间我”jmap -histo“查看了一下内存的情况列出前面一部分

 num     #instances         #bytes  class name
----------------------------------------------
   1:      14361290      574451600  java.lang.ref.Finalizer
   2:      14361233      229779728  A
   3:          5834         752032  <methodKlass>
   4:          5834         665464  <constMethodKlass>
   5:           390         460040  <constantPoolKlass>
   6:           361         287936  <constantPoolCacheKlass>
   7:           390         265720  <instanceKlassKlass>
   8:           580         100032  [B
   9:          1088          98184  [C
  10:           450          54912  java.lang.Class
  11:           637          42104  [[I
  12:           588          35864  [S
  13:            98          33776  <methodDataKlass>
  14:          1068          25632  java.lang.String
  15:            43          23048  <objArrayKlassKlass>
  16:           332          14888  [Ljava.lang.Object;

同时开启了”jstat -gcutil“ 每10秒输出一下内存情况:

   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00  99.97  11.98     16    2.942   311  800.257  803.199
  0.00   0.00 100.00  99.97  11.98     16    2.942   315  810.338  813.280
  0.00   0.00 100.00  99.97  11.98     16    2.942   319  821.707  824.649
  0.00   0.00 100.00  99.97  11.98     16    2.942   322  828.997  831.939
  0.00   0.00 100.00  99.97  11.98     16    2.942   326  840.352  843.294
  0.00   0.00 100.00  99.97  11.98     16    2.942   330  850.328  853.270
  0.00   0.00 100.00  99.97  11.98     16    2.942   334  860.378  863.320
  0.00   0.00 100.00  99.97  11.98     16    2.942   338  870.360  873.303
  0.00   0.00 100.00  99.97  11.98     16    2.942   342  881.775  884.717
  0.00   0.00 100.00  99.98  11.98     16    2.942   346  890.937  893.879
  0.00   0.00 100.00  99.98  11.98     16    2.942   350  900.010  902.952
  0.00   0.00 100.00  99.98  11.98     16    2.942   354  911.709  914.651
  0.00   0.00 100.00  99.98  11.98     16    2.942   358  921.747  924.690
  0.00   0.00 100.00  99.98  11.98     16    2.942   362  931.774  934.716
  0.00   0.00 100.00  99.98  11.98     16    2.942   365  940.425  943.368
  0.00   0.00 100.00  99.98  11.98     16    2.942   369  949.229  952.171
  0.00   0.00 100.00  99.98  11.98     16    2.942   374  961.256  964.198
  0.00   0.00 100.00  99.98  11.98     16    2.942   378  969.483  972.426
  0.00   0.00 100.00  99.98  11.98     16    2.942   382  981.367  984.310
  0.00   0.00 100.00  99.98  11.98     16    2.942   385  990.289  993.231
  0.00   0.00 100.00  99.98  11.98     16    2.942   390 1001.206 1004.148
  0.00   0.00 100.00  99.98  11.98     16    2.942   394 1010.286 1013.228
  0.00   0.00 100.00  99.98  11.98     16    2.942   398 1019.592 1022.534
  0.00   0.00 100.00  99.98  11.98     16    2.942   402 1029.680 1032.622
  0.00   0.00 100.00  99.98  11.98     16    2.942   407 1041.591 1044.533
  0.00   0.00 100.00  99.98  11.98     16    2.942   410 1050.284 1053.226
  0.00   0.00 100.00  99.98  11.98     16    2.942   414 1059.329 1062.271
  0.00   0.00 100.00  99.98  11.98     16    2.942   419 1070.965 1073.907
  0.00   0.00 100.00  99.98  11.98     16    2.942   424 1081.198 1084.140
  0.00   0.00 100.00  99.98  11.98     16    2.942   427 1089.876 1092.818
  0.00   0.00 100.00  99.98  11.98     16    2.942   431 1100.093 1103.035
  0.00   0.00 100.00  99.98  11.98     16    2.942   435 1111.654 1114.596
  0.00   0.00 100.00  99.98  11.98     16    2.942   438 1120.271 1123.213
  0.00   0.00 100.00  99.98  11.98     16    2.942   442 1130.434 1133.377
  0.00   0.00 100.00  99.98  11.98     16    2.942   446 1140.847 1143.789
  0.00   0.00 100.00  99.98  11.98     16    2.942   449 1149.426 1152.368
  0.00   0.00 100.00  99.98  11.98     16    2.942   453 1161.134 1164.076
  0.00   0.00 100.00  99.99  11.98     16    2.942   457 1171.549 1174.491
  0.00   0.00 100.00  99.99  11.98     16    2.942   461 1181.832 1184.774
  0.00   0.00 100.00  99.99  11.98     16    2.942   464 1190.697 1193.639
  0.00   0.00 100.00  99.99  11.98     16    2.942   467 1199.502 1202.444
  0.00   0.00 100.00  99.99  11.98     16    2.942   471 1209.630 1212.573
  0.00   0.00 100.00  99.99  11.98     16    2.942   475 1221.009 1223.951
  0.00   0.00 100.00  99.99  11.98     16    2.942   479 1230.131 1233.073
  0.00   0.00 100.00  99.99  11.98     16    2.942   484 1243.104 1246.046
  0.00   0.00 100.00  99.99  11.98     16    2.942   488 1253.201 1256.143
  0.00   0.00 100.00  99.99  11.98     16    2.942   493 1263.465 1266.407
  0.00   0.00 100.00  99.99  11.98     16    2.942   497 1273.876 1276.818
  0.00   0.00 100.00  99.99  11.98     16    2.942   501 1284.289 1287.231
  0.00   0.00 100.00  99.99  11.98     16    2.942   505 1294.458 1297.400
  0.00   0.00 100.00  99.99  11.98     16    2.942   509 1304.680 1307.622
  0.00   0.00 100.00  99.99  11.98     16    2.942   512 1312.040 1314.982
  0.00   0.00 100.00  99.99  11.98     16    2.942   516 1323.525 1326.467
  0.00   0.00 100.00  99.99  11.98     16    2.942   519 1332.110 1335.052
  0.00   0.00 100.00  99.99  11.98     16    2.942   523 1343.589 1346.531
  0.00   0.00 100.00  99.99  11.98     16    2.942   527 1353.821 1356.763
  0.00   0.00 100.00  99.99  11.98     16    2.942   531 1363.991 1366.933
  0.00   0.00 100.00  99.99  11.98     16    2.942   535 1374.182 1377.124
  0.00   0.00 100.00  99.99  11.98     16    2.942   539 1383.153 1386.095
  0.00   0.00 100.00  99.99  11.98     16    2.942   543 1394.664 1397.607
  0.00   0.00 100.00  99.99  11.98     16    2.942   547 1404.739 1407.681
  0.00   0.00 100.00  99.99  11.98     16    2.942   550 1413.506 1416.449
  0.00   0.00 100.00  99.99  11.98     16    2.942   553 1422.097 1425.039
  0.00   0.00 100.00  99.99  11.98     16    2.942   557 1432.418 1435.360
  0.00   0.00 100.00  99.99  11.98     16    2.942   561 1442.988 1445.930
  0.00   0.00 100.00 100.00  11.98     16    2.942   565 1453.498 1456.440
  0.00   0.00 100.00 100.00  11.98     16    2.942   569 1462.421 1465.363
  0.00   0.00 100.00 100.00  11.98     16    2.942   573 1472.499 1475.441
  0.00   0.00 100.00 100.00  11.98     16    2.942   578 1484.331 1487.273
  0.00   0.00 100.00 100.00  11.98     16    2.942   582 1494.491 1497.433
  0.00   0.00 100.00 100.00  11.98     16    2.942   585 1503.437 1506.379
  0.00   0.00 100.00 100.00  11.98     16    2.942   589 1514.651 1517.594
  0.00   0.00 100.00 100.00  11.98     16    2.942   593 1524.390 1527.332
  0.00   0.00 100.00 100.00  11.98     16    2.942   596 1531.997 1534.939
  0.00   0.00 100.00 100.00  11.98     16    2.942   601 1543.990 1546.932
  0.00   0.00 100.00 100.00  11.98     16    2.942   605 1554.228 1557.170
  0.00   0.00 100.00 100.00  11.98     16    2.942   609 1563.043 1565.985
  0.00   0.00 100.00 100.00  11.98     16    2.942   613 1574.420 1577.363
  0.00   0.00 100.00 100.00  11.98     16    2.942   616 1584.272 1587.214
  0.00   0.00 100.00 100.00  11.98     16    2.942   620 1592.993 1595.935
  0.00   0.00 100.00 100.00  11.99     16    2.942   624 1601.974 1604.916
  0.00   0.00 100.00 100.00  12.00     16    2.942   629 1614.195 1617.137
  0.00   0.00 100.00 100.00  12.06     16    2.942   633 1624.317 1627.259
  0.00   0.00 100.00 100.00  12.07     16    2.942   636 1632.946 1635.888
  0.00   0.00 100.00 100.00  12.07     16    2.942   638 1642.924 1645.866
  0.00   0.00 100.00 100.00  12.10     16    2.942   642 1652.975 1655.917
  0.00   0.00 100.00 100.00  12.10     16    2.942   646 1662.004 1664.946

下面是快结束部分的程序控制台输出:

it is 14647292
it is 14647589
it is 14647612
it is 14647744
it is 14647822
it is 14648143
it is 14648443
it is 14648533
it is 14648734
it is 14649050
Exception in thread "main" it is 14649272
it is 14649577
it is 14649749
it is 14650163
it is 14650390
it is 14650734
it is 14651069
it is 14651245
it is 14651534

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
it is 14651767
it is 14651936
it is 14652149
it is 14652323
it is 14652407
it is 14652472
it is 14652535
it is 14652603
it is 14652681
it is 14652754
it is 14652908
it is 14653070
it is 14653178
it is 14653234
it is 14653304
it is 14653459
it is 14653513
it is 14653639
it is 14653765
it is 14653782
it is 14653950
it is 14654060
it is 14654125
it is 14654179
it is 14654455
it is 14654613
it is 14654612
it is 14654637
it is 14654710

可以看到报出了一个异常和一个错误,报出OutOfMemoryError之后并没有立即停止。还运行了一段时候,而且也有几分钟。(整个测试用了近30分钟)。最后也没有输出“is end”,说明是被异常或错误终止的java.lang.ref.Finalizer和A的instance一直占有很大地空间。这也说明jvm没有很好地释放内存,最终造成内存泄露。这样能不能说这是jvm内存处理的一个bug呢?再下去估计得翻源码了。

本人愚钝,望交流指教。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值