Thanks Aleksey. I know a bit farther now.

On 25 January 2018 at 03:13, Aleksey Shipilev <[email protected]>
wrote:

> On 01/25/2018 03:44 AM, 'Carl Mastrangelo' via mechanical-sympathy wrote:
> > Consider the following code:
> >
> > public class Test {
> >   static volatile Integer discard;
> >   public static void main(String [] args) throws InterruptedException {
> >     printMemory();
> >     System.gc();
> >     printMemory();
> >     int iterations = 1000;
> >     int[] vals = new int[100_000_000];
> >     while (args.length == 0) {
> >       printMemory();
> >       System.gc();
> >       Thread.sleep(200);
> >       discard = iterations++;
> >     }
> >   }
> >
> >   private static void printMemory() {
> >     System.out.println(Runtime.getRuntime().totalMemory() -
> Runtime.getRuntime().freeMemory());
> >   }
> > }
> >
> > I am surprised to see the memory used by this code starts at about
> 200MB, goes up to 600MB, but
> > never seems to go back down.  The large int array accounts for the
> memory usage jump, but it never
> > seems to be garbage collected.  Why?   The variable is never read after
> it is allocated.  It cannot
> > be reordered by the compiler to be after the while loop, because I can
> see the memory jump.  I am
> > intentionally allocating memory in the loop by boxing the integer.
> Enabling +PrintCompilation and
> > PrintInlining never shows main() being inlined; perhaps it is not being
> compiled?
>
> This is not escape analysis. It is more about compiler able to figure out
> the reachability of local
> variable, and let GC act:
>   https://shipilev.net/jvm-anatomy-park/8-local-var-reachability/
>
> It is predicated on the condition that method is actually compiled and
> optimized accordingly. OSR
> would not cut it here, I think, because the OSR version of the method
> would still treat that
> variable alive.
>
> $ java Test
> 10548688
> 260648
> 410809368
> 410673344
> 400260544
> 400260544
> 400260544
> 400260544
> 400260544
> 400260544
>
> It changes if you compile the method before entering it:
>
> $ java -Xcomp Test
> 73841024
> 296240
> 421393656
> 10580272
> 10580608
> 10580608
> 10580608
> 10580608
>
> Thanks,
> -Aleksey
>
> --
> You received this message because you are subscribed to the Google Groups
> "mechanical-sympathy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"mechanical-sympathy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to