escape analysis issue with nested objects
Vladimir Kozlov
vladimir.kozlov at oracle.com
Thu May 25 19:03:57 UTC 2017
Hi Attila,
What Java version you are using?
I tried jdk 7, 8, 9.
What I see is that in both cases only arrays are eliminated
(-XX:+PrintEliminateAllocations with debug version of VM):
BEGIN single
Scalar 73 AllocateArray === 51 46 47 8 1 ( 71 59 21 58 41 1
1 ) [[ 74 75 76 83 84 85 ]] rawptr:NotNull ( int:>=0,
java/lang/Object:NotNull *, bool, int ) NewMain::single @ bci:9 !jvms:
NewMain::single @ bci:9
++++ Eliminated: 73 AllocateArray
END single
BEGIN multi
Scalar 116 AllocateArray === 91 86 87 8 1 ( 114 103 21 102 41
76 1 1 1 ) [[ 117 118 119 126 127 128 ]] rawptr:NotNull (
int:>=0, java/lang/Object:NotNull *, bool, int ) NewMain::multi @ bci:17
!jvms: NewMain::multi @ bci:17
++++ Eliminated: 116 AllocateArray
DONE
But based on code non of objects should be allocated - both methods
should have only 'return' generated.
Looks like EA missing such case when objects are stored into small array.
Thanks,
Vladimir
On 5/25/17 9:16 AM, Hontvári Attila wrote:
> When creating a non-escaping array and putting a newly created,
> non-escaping object in it, the EA works, there are no heap allocations.
>
> private static void single() {
> Object x = new Object();
> Object[] array = new Object[]{x};
> Object a = array[0];
> }
>
> But if we do the same with two or more objects, the array will be
> allocated on the heap, and not eliminated.
>
> private static void multi() {
> Object x = new Object();
> Object y = new Object();
> Object[] array = new Object[]{x, y};
> Object a = array[0];
> Object b = array[1];
> }
>
> Is there a reason why it is only working in the first case?
>
> This would be useful for example, MethodHandle::invokeWithArguments,
> when the primitive types are boxed, and put into a varargs array, see my
> older email [1].
>
> A complete test source code is in [2], if we run it with -verbose:gc, we
> can see there are many GCs in the second case, but there are no GCs in
> the first case.
>
> [1]
> http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-January/010933.html
>
> [2] https://gist.github.com/anonymous/bd46075ef1ebd858dae49fe6cfe39da8
>
More information about the hotspot-compiler-dev
mailing list