测试环境:
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呢?再下去估计得翻源码了。
本人愚钝,望交流指教。
有勇气并不表示恐惧不存在,而是敢面对恐惧克服恐惧