Welcome to the Minimal Value Types early adopter's project !
Target Audience
- Power users who are comfortable with early experimental software
- who recognize that everything in the experiment - the model, the classfile extensions, the byte codes is likely to change
- who want to contribute to early exploration of Value Types
- who will not build any products based on these prototypes
- Who are willing to provide feedback to the developers on a subset of Value Type features
- Who will provide use cases for the development team to experiment with optimizations
Programming Model
- Create a POJO using an experimental javac, with an annotation ValueCapableClass
- JVM will derive a Derived Value Class (DVC) from this defined "box" which we call the Value Capable Class (VCC)
- DVC contains an immutable copy of the instance fields from the VCC
- Work with MethodHandles and experimental reflection package ValueType (jdk.experimental.value.ValueType)
- Or spin your own byte codes
- experimental MethodBuilder (jdk/experimental/value.MethodHandleBuilder)
- future: ASM support is planned
Repository and Build Instructions
To create a new mvt branch:
hg clone http://hg.openjdk.java.net/valhalla/valhalla valhalla
cd valhalla
sh get_source.sh
sh common/bin/hgforest.sh update -r mvt
To update repository:
cd valhalla
sh common/bin/hgforest.sh pull
sh common/bin/hgforest.sh update -r mvt
To build repository
bash configure
make images
http://cr.openjdk.java.net/~chegar/docs/sandbox.html // instructions for working with branch repositories
Note: Valhalla is a child of the jdk10/hs repository, to keep current with latest hotspot development.
Filing Bugs
- File bugs with synopsis starting with "[MVT]" and label: mvt please
Feature Subset
- Derived Value Class is a new type which is:
- immutable, identity-agnostic, non-nullable, non-synchronizable, final
- does not inherit from java.lang.Object
- Arrays of value types are flattened
- Derived Value Class can contain primitives or references
Experimental JVMS appendix (http://cr.openjdk.java.net/~dlsmith/values.html)
- Derived Value Class derivation rules
- temporary name mangling: class Foo.class generates Foo$Value
- Classfile extensions
- temporary CONSTANT_Class: ";QFoo$Value", uses ";Q" as an escape to a derived value class name
- field and method descriptors: "Q<value name>; in place of "L<reference name>;
- Bytecodes
- value types byte codes: vdefault, vwithfield, vload, vstore, vreturn, vaload, vastore, vbox, vunbox
- overloaded bytecodes: getfield, anewarray, multianewarray
Limitations
- platforms: x64 Linux, x64 Mac OS X
- no verifier (work-in-progress)
- no VarHandles
- no support for atomic fields containing value types
- no JNI, unsafe, redefineclasses, reflection
- -Xint and C2 only, no C1, no tiered-compilation
- interpreter is not optimized, focus is on JIT optimization
- Need additional USE CASES for optimizations
- Working on additional test cases
References
- Experimental Appendix for Java Virtual Machine Specification for Value Classes
- http://cr.openjdk.java.net/~chegar/docs/sandbox.html // instructions for working with branch repositories
https://wiki.openjdk.java.net/display/valhalla/Minimal+Value+Types+and+Valhalla+value+types+command+line+options // MVT and post-MVT command-line options
(TODO - attach slide presentations from JVMLS ?)