Value types - compatibility with existing “value objects”
Peter Levart
peter.levart at gmail.com
Fri Jan 9 07:14:45 UTC 2015
On 01/09/2015 06:52 AM, David Holmes wrote:
> On 9/01/2015 11:57 AM, David M. Lloyd wrote:
>> On 01/08/2015 06:37 PM, John Rose wrote:
>>> On Jan 8, 2015, at 4:29 PM, Vitaly Davidovich <vitalyd at gmail.com>
>>> wrote:
>>>> Thanks John. I read that paragraph just now and do see mention of
>>>> spilling to heap. However, the bulk of the paragraph talks about the
>>>> intended use of value types, which I fully agree with. The register
>>>> file is just an example of how one can best achieve performance by
>>>> scalarizing the value type across registers - great, love it!
>>>> However, I don't quite understand why you need to spill to heap and
>>>> not restrict it to stack only. I know this is probably discussing a
>>>> pathological case as I'd imagine the threshold you pick will not be
>>>> hit by people actually writing performant code, so perhaps we don't
>>>> need to discuss it at length.
>>>> In terms of freedom of implementation, another thing I highly agree
>>>> with. However, I'd like to have a bit more control in some cases.
>>>> There are things the VM does that either I can't do reasonably or at
>>>> all and I appreciate that (e.g. the various JIT optimizations around
>>>> devirtualization as just one example). But, for some things I'd like
>>>> to have more say :). Storage is one of them. I'm sure you guys know
>>>> that there are people out there that either avoid the GC like a
>>>> plague and/or take their data offheap. Using stack for temps is
>>>> almost always going to be preferred over heap. Anything that we can
>>>> do to facilitate that would be fantastic. Automatic storage is great
>>>> when it's warranted, but it's a big hammer in some situations.
>>>>
>>>> P.S. I think GC still doesn't sit well with certain groups of people,
>>>> thus some excitement about new languages like Rust and criticism of
>>>> others (e.g. Go, D) that have it. Obviously I'm not saying java
>>>> needs to abandon it, but there are folks building middleware/infra
>>>> components where they'd like better facilities.
>>>>
>>> Thanks for the good comments, Vitaly. Yes, GC is a key value-add, and
>>> requires a whole team to keep fresh.
>>>
>>> Indeed we are looking at managing stack more cleverly also. A warning
>>> note: If you OOME by moving stuff onto stack, you increase the
>>> frequency of SOE!
>>
>> Worth mentioning that SOE is infinitely more recoverable than heap OOME.
>> In the latter case (especially with complex systems, where the risk is
>> ironically even higher of it happening) there's often not much you can
>> do other than kill off the JVM and try again. But if you run out of
>> stack, everything should unwind in a very predictable (and fast) manner.
>> You could even automatically rebuild your thread pools with larger
>> stack sizes fairly easily.
>
> Going OT but I strongly disagree. At least people try to write code
> that accounts for potential OOME for explicit allocation sites (eg
> allocate first then modify local state that affects invariants). I've
> never seen any code that anticipates that any call might trigger a SOE.
>
> David H.
>
Another point to consider is that heap is shared among all threads and
stack space is allocated per-thread. If peak stack utilization increases
with value types in some threads and as a consequence user increases
max. stack size for the whole JVM, a lot of space is wasted in many
threads that don't need that much stack space. There are various
trade-offs here.
Peter
More information about the valhalla-dev
mailing list