InvokeDynamic PIC Slowdown (deopt issue?) need advice

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu Jun 2 11:23:56 UTC 2016


Never-taken GWT branches (on per-MH instance basis) are aggressively 
pruned during JIT-compilation.

So, in the worst case, a MH chain containing 6 GWT can experience 6 
recompilations.

I don't know what Java version you use, but there were a number of bugs 
fixed in HotSpot, which manifested as methods marked as non-compilable 
due to profile pollution (e.g., JDK-8074551 [1]). I suggest to monitor 
JIT compiler activity as well.

Best regards,
Vladimir Ivanov

[1] https://bugs.openjdk.java.net/browse/JDK-8074551

On 5/31/16 10:41 PM, Mark Roos wrote:
> I have been implementing a Smalltalk on the JVM (Rtalk)  which has gone
> quite well.  But recently
> I was told that one of our key benchmarks had suffered a large slowdown,
>  from a few hundred
> mS to seconds.  And strangely it gets slower the more its executed until
> we reset all of the call sites.
>
> Looking closer I found at least one reproducible cause which leads me to
> think that there is some
> issue with how I do PICs and how Hotspot tries to inline them.
>
> We have a common case where we reset an array of objects by copying one
> instance var to another.
> The Smalltalk class of each value can be one of several so there is some
> level of polymorphism at
> each site.  Interesting for several of these arrays the reset time was
> 200uS or so but for one it was
> 1000 mS.  The only difference was that in the fast ones the Smalltalk
> class types were bunched while
> in the slow case they were distributed.  I found that by setting all of
> the Smalltalk classes to the same
> type the time dropped to a few hundred uS. Leading me to think my PIC
> was the problem.
>
> The problem Smalltalk code looks like this:
>    idleValue isNil
>         ifFalse:[finalValue := idleValue deepCopy]
>         ifTrue:[finalValue := default].
>
> There are two invoke dynamic sites, isNil and deepCopy.  Removing
> deepCopy has little effect but
> removing the isNil test saves most of the time.  Interesting isNil is a
> very small method ( returns a
> constant of true or false ) so my thought is that it would be logically
> inlined.  While deepCopy is large.
>
> It looks like, from some fine timing, that each time the Smalltalk class
> changes there is a large amount
> of time added to the call.  Which I would expect if there was a deopt
> whenever a different GWT triggered.
> There are 6 GWTs in this chain ( idleValue can be one of six Smalltalk
> classes).
>
> Any ideas on how I can avoid this?
>
> Notes:
> Each of my Smalltalk objects is an instance of a single Java class.  The
> Smalltalk class is determined
> by a compare on one of its instance vars.  So looking at the Java class
> at a callsite it would always
> be a constant.
>
> My call site chain looks like
>         a mutable site whose target is a fixed set of methodHandles
> terminated by another mutable site
>         whose target is the chain of GWTs.
>
> thanks
> mark
>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>


More information about the mlvm-dev mailing list