Hi,

On 06/05/2015 11:11 PM, Jonathan Payne wrote:
My problem was that finalization was not being run at all with the G1 
collector. Not at all. That would have been fine with me because none of the 
existing objects in the Finalizer queue actually needed the service anymore: 
the files, sockets, streams, etc. had all been properly closed by my 
application, otherwise the server would have long since failed completely. 
However, those objects started to accumulate in the VM and eventually (8 hours 
later) brought the server down.

I made a quick test comparing default (PS MarkSweep / PS Scavenge) and G1 collectors with -Xmx512m option. When finalizable objects are released immediately after construction with a sustained rate of ~90 objects/ms, the results for default collector are:

Finalization, PATCHED, PS MarkSweep, PS Scavenge
Heap: init = 260046848(253952K) used = 9175232(8960K) committed = 249561088(243712K) max = 477626368(466432K)

  construction threads: 1
  instances per thread: 10000000
  cons. per 1 ms sleep: 100
~5s interval cumulative active pool queued t[ms] construct. destruct. in-flight con./ms des./ms con./ms des./ms thr. size tasks ------- ---------- ---------- ---------- ------- ------- ------- ------- ----- ----- ---------- 5000 439500 0 439500 87 0 87 0 0 0 0 10002 877703 0 877703 87 0 87 0 0 0 0 15004 1308200 238692 1069508 86 47 87 15 0 0 0 20006 1747600 238692 1508908 87 0 87 11 0 0 0 25008 2177600 478173 1699427 85 47 87 19 0 1 0 30010 2620800 478173 2142627 88 0 87 15 0 0 0 35012 3067800 478173 2589627 89 0 87 13 0 0 0 40014 3463600 3302385 161215 79 564 86 82 0 1 0 45016 3903200 3302385 600815 87 0 86 73 0 0 0 50018 4342800 3302385 1040415 87 0 86 66 0 0 0 55020 4772809 3564145 1208664 85 52 86 64 0 0 0 60021 5212000 3564145 1647855 87 0 86 59 0 0 0 65023 5611300 4096555 1514745 79 106 86 63 1 1 47 70024 6051400 5609375 442025 88 302 86 80 0 0 0 75025 6477000 6424132 52868 85 162 86 85 0 1 0 80026 6916000 6424132 491868 87 0 86 80 0 0 0 85027 7355600 6424132 931468 87 0 86 75 0 0 0 90028 7780400 7490435 289965 84 213 86 83 0 0 0 95029 8220800 7490435 730365 88 0 86 78 0 0 0 100029 8644500 8550627 93873 84 211 86 85 0 1 0 105031 9084400 8550627 533773 87 0 86 81 0 0 0 110032 9524100 8550627 973473 87 0 86 77 0 0 0 115033 9948900 9618391 330509 84 213 86 83 0 0 0 120033 10000000 9618391 381609 10 0 83 80 0 0 0 125205 10000000 10000000 0 0 73 79 79 0 0 0


And for G1:

Finalization, PATCHED, G1 Young Generation, G1 Old Generation
Heap: init = 260046848(253952K) used = 3145728(3072K) committed = 260046848(253952K) max = 536870912(524288K)

  construction threads: 1
  instances per thread: 10000000
  cons. per 1 ms sleep: 100
~5s interval cumulative active pool queued t[ms] construct. destruct. in-flight con./ms des./ms con./ms des./ms thr. size tasks ------- ---------- ---------- ---------- ------- ------- ------- ------- ----- ----- ---------- 5000 437600 337879 99721 87 67 87 67 0 1 0 10002 876200 592612 283588 87 50 87 59 0 0 0 15004 1309600 1032801 276799 86 87 87 68 0 0 0 20006 1742200 1545349 196851 86 102 87 77 0 0 0 25008 2172300 2152632 19668 85 121 86 86 0 1 0 30010 2617800 2152632 465168 89 0 87 71 0 0 0 35012 3047400 2783284 264116 85 126 87 79 0 0 0 40139 3487900 2783284 704616 85 0 86 69 0 0 0 45140 3929800 3597818 331982 88 162 87 79 0 0 0 50142 4374400 3597818 776582 88 0 87 71 0 0 0 55144 4797700 4641649 156051 84 208 87 84 0 1 0 60145 5242800 4641649 601151 88 0 87 77 0 0 0 65147 5670900 5458835 212065 85 163 87 83 0 0 0 70148 6101400 6071013 30387 86 122 86 86 0 1 0 75150 6546100 6071013 475087 88 0 87 80 0 0 0 80151 6990100 6071013 919087 88 0 87 75 0 0 0 85153 7432600 6071013 1361587 88 0 87 71 0 0 0 90154 7850400 7506935 343465 83 287 87 83 0 0 0 95154 8280100 8175574 104526 85 133 87 85 0 1 0 100155 8713200 8675215 37985 86 99 86 86 0 1 0 105156 9158500 8675215 483285 89 0 87 82 0 0 0 110157 9603800 8675215 928585 89 0 87 78 0 0 0 115158 10000000 8675215 1324785 79 0 86 75 0 0 0 120761 10000000 10000000 0 0 236 82 82 0 0 0


...which suggests that G1 is no less eager to process finalizable objects that are young garbage (see "in-flight" column). At least it doesn't seem that they accumulate. So your problem might have been with finalizable objects escaping to old-gen. Tuning the young-gen size and survivor ratio might help in your case.

Regards, Peter

Reply via email to