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 14647292it is 14647589it is 14647612it is 14647744it is 14647822it is 14648143it is 14648443it is 14648533it is 14648734it is 14649050Exception in thread "main" it is 14649272it is 14649577it is 14649749it is 14650163it is 14650390it is 14650734it is 14651069it is 14651245it is 14651534Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"it is 14651767it is 14651936it is 14652149it is 14652323it is 14652407it is 14652472it is 14652535it is 14652603it is 14652681it is 14652754it is 14652908it is 14653070it is 14653178it is 14653234it is 14653304it is 14653459it is 14653513it is 14653639it is 14653765it is 14653782it is 14653950it is 14654060it is 14654125it is 14654179it is 14654455it is 14654613it is 14654612it is 14654637it is 14654710

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

本人愚钝,望交流指教。

有勇气并不表示恐惧不存在,而是敢面对恐惧克服恐惧

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

相关文章:

你感兴趣的文章:

标签云: