@Howard Your suggestion could pretty much work if the underlying VM is using a conservative collector, where it'd actually include a set of filters to check if a value is a (or "looks like a") real reference.
There are also a couple of runtimes that implements exact GC by tagging values, but most JVMs that I know of doesn't work that way. They'd expect all reference type fields to contain valid references. - Kris On Tue, Jul 3, 2012 at 1:46 PM, Howard Lovatt <howard.lov...@gmail.com>wrote: > @Kris, I was assuming that the tag would be sufficient for the JVM since > 'real' references would be aligned and hence naturally not tagged. But I > don't know enough about the JVM and hence you could well be correct. -- > Howard. > > > On 3 July 2012 15:40, Krystal Mok <rednaxel...@gmail.com> wrote: > >> On Tue, Jul 3, 2012 at 1:28 PM, Howard Lovatt <howard.lov...@gmail.com>wrote: >> >>> I like the idea and something along these lines would be a great >>> addition to the standard library, which I will come back to as a PS. >>> >>> In com.sun.misc.Unsafe there are already getLong(Object, int) and >>> setLong(Object, int, long) methods and the same for Object. No doubt if we >>> used getLong and setLong as they stand they would fail due to type checking >>> if used to access references to Objects in an Object[]. However if similar >>> methods were added that circumvented the type checking, >>> getLongOrReference(Object, int) and setLongOrReference(Object, int, long), >>> then you could write: >>> >>> private Object[] vsAndRs; >>> >>> ... >>> >>> @Override public long getValue(final int index) { >>> checkIndex(pos); >>> final long value = Unsafe.getLongOrReference(vsAndRs, index); >>> if ( (value & TaggedArrays.TAG) != 0 ) { >>> return value; >>> } >>> throw new TaggedArrayException("value at index =" + index + " is not >>> tagged"); >>> } >>> >>> @Override public Object getReference(final int index) { >>> if ( isReference(index) ) { >>> return vsAndRs[index]; >>> } >>> throw new TaggedArrayException("reference at index =" + index +" is >>> tagged"); >>> } >>> >>> .. >>> >>> Which would save half the space and still be understandable Java (i.e. >>> not a collection of native calls). >>> >>> It's not just about type checking at Java level, but also something deep >> within the VM: the need to distinguish between a plain value and a >> reference (pointer), which is fundamental to a exact/accurate garbage >> collector. >> Jim's idea includes modifying the doOop() function in the VM, which is >> exactly where HotSpot handles reference fields within an object. >> >> If you put random values into a place where HotSpot (or other JVM impls >> using exact GC) think it's a reference, then something bad may happen later >> (e.g. during GC), that the VM think it had found a corrupted reference. >> >> - Kris >> >> >>> Great work, >>> >>> -- Howard. >>> >>> PS A few random thoughts for the interface, assuming that something like >>> this makes it into the JDK then the following additions might be nice: >>> >>> 1. Fills that accept a lambda that receives the index as its argument >>> (filling function as opposed to filling constant). >>> 2. A second interface and second factory that define tagged arrays for >>> long and double in addition to Objects, like the example code given. >>> 3. TaggedArray32, primarily for phones etc., with the extended >>> interface, point 2 above, for TaggedArray32 accepting Objects, ints, and >>> floats. On a 64 bit system TaggedArray32 would be the same as TaggedArray, >>> but for 32 bit systems it would save space. >>> >>> >>> On 2 July 2012 23:05, Jim Laskey <jlas...@me.com> wrote: >>> >>>> During a week in the rarefied air of Stockholm back in May, a sleepless >>>> night got me thinking. The day after that, the thinking became a reality. >>>> I've been sitting on the code since, not sure what to do next. So..., why >>>> not start the month leading up to the JVMLS with a discussion about dynamic >>>> values. >>>> >>>> Every jLanguage developer knows that primitive boxing is the enemy. >>>> Even more so for untyped languages. We need a way to interleave primitive >>>> types with references. >>>> >>>> Tagged values (value types) for dynamic languages have been approached >>>> from a dozen different angles over the history of Java. However, no one >>>> seems to be satisfied with any of the proposals so far. Either the >>>> implementation is too limiting for the language developer or too complex to >>>> implement. >>>> >>>> Most recently, John (Rose) proposed hiding value tagging in the JVM via >>>> the Integer/Long/Float/Double.valueof methods. I saw a few issues with >>>> this proposal. First, the implementation works differently on 32 bit and >>>> 64 bit platforms (only half a solution on each). Secondly, control of the >>>> tag bits is hidden such that it doesn't give a language implementor any >>>> leeway on bit usage. Finally, it will take a long time for it to get >>>> introduced into the JVM. The implementation is complex, scattered all over >>>> the VM and will lead to a significant multiplier for testing coverage. >>>> >>>> It occurred to me on that sleepless Monday night, that the solution for >>>> most dynamic languages could be so much simpler. First, we have to look at >>>> what it is we really need. Ultimately it's about boxing. We want to avoid >>>> allocating memory whenever we need to store a primitive value in an object. >>>> Concerning ourselves with passing around tagged values in registers and >>>> storing in stack frames is all red herring. All that is needed is a >>>> mechanism for storing tagged values (or compressed values) in a no-type >>>> slot of a generic object. Thinking about it in these terms isolates all >>>> issues to a single array-like class, and thus simplifies implementation and >>>> simplifies testing. Instances of this class can be used as objects, as >>>> stack frames and even full stacks. A good percentage of a dynamic language >>>> needs are covered. >>>> >>>> So, Rickard Bäckman (also of Oracle) and I defined an API and >>>> implemented (in HotSpot) an interface called TaggedArray. Conceptional, >>>> TaggedArray is a fixed array of no-type slots (64-bit), where each slot can >>>> contain either a reference or a tagged long value (least significant bit >>>> set.) Internally, TaggedArray class's doOop method knows that it >>>> should skip any 64-bit value with the least significant bit set. How >>>> the language developer uses the other 63 bits is up to them. References >>>> are just addresses. On 32 bit machines, the address (or packed address) is >>>> stored in the high 32-bits (user has no access) So there is no >>>> interference with the tag bit. >>>> >>>> We supply four implementations of the API. 1) is a naive two parallel >>>> arrays (one Object[], one long[]) implementation for platforms not >>>> supporting TaggedArrays (and JDK 1.7), 2) an optimized version of 1) that >>>> allocates each array on demand, 3) a JNI implementation (minimally needed >>>> for the interpreter) that uses the native implementation and 4) the native >>>> implementation that is recognized by both the C1/C2 compilers (effort only >>>> partially completed.) In general, the implementation choice is transparent >>>> to the user (optimal choice.) >>>> >>>> I've enclosed a JavaDoc and the roughed out source. For discussion. >>>> Fire away. >>>> >>>> Cheers, >>>> >>>> -- Jim >>>> >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> mlvm-dev mailing list >>>> mlvm-dev@openjdk.java.net >>>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev >>>> >>>> >>> >>> >>> -- >>> -- Howard. >>> >>> >>> _______________________________________________ >>> mlvm-dev mailing list >>> mlvm-dev@openjdk.java.net >>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev >>> >>> >> >> _______________________________________________ >> mlvm-dev mailing list >> mlvm-dev@openjdk.java.net >> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev >> >> > > > -- > -- Howard. > > > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > >
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev