JamVM Changelog

What's new in JamVM 2.0.0

Jul 31, 2014
  • Added support for OpenJDK 6, 7 and 8.
  • OpenJDK: JSR 292: show full anonymous/lamdba class name in stack trace
  • OpenJDK: JSR 292: resolvePolyMethod race-conditions
  • OpenJDK: JSR 292: Free callsite linked-list on class GC
  • OpenJDK: JSR 292: Fix for invokedynamic resolution (must be per callsite)
  • OpenJDK: JSR 292: constant method handle can be signature polymorphic
  • All: More command-line compatibility options
  • OpenJDK: Use correct thread group function when thread dies
  • GNU Classpath: update JamVM's version of VMAccessController
  • All: Check ClassBlock padding at VM initialisation
  • GNU Classpath: Update GNU Classpath ClassBlock padding
  • OpenJDK: Make ClassBlock padding dependent on OpenJDK version
  • OpenJDK: JSR 292: Fix RepetitiveLambdaSerialization jtreg test
  • OpenJDK: Fix compatibility issues on different Unixes
  • All: Explicitly initialise java.lang.Class
  • All: Optimise ClassBlock structure
  • OpenJDK: JSR 292: anonymous class resolution to itself
  • OpenJDK: JSR 292: anonymous classes should use host_class permissions
  • OpenJDK: JSR 292: findInvokeDynamicInvoker fix exception handling
  • OpenJDK: JSR 292: Fix CallStaticInitOrder jtreg test
  • OpenJDK: JVM_NewMultiArray: element class may be an array
  • OpenJDK: jtreg test java/lang/reflect/Array/ExceedMaxDim
  • OpenJDK: Fix Local/Anonymous class checks
  • All: Fix race-condition in constant-pool resolution code
  • OpenJDK: JSR 292: MethodHandle constant-pool refs may be resolved
  • OpenJDK: JSR 292: bootstrap method args error handling
  • GNU Classpath: race-condition in thread detach
  • GNU Classpath: fix threading issue in lookupLoadedDlls0
  • All: Race condition in setting up imethod table
  • All: GC: Several minor performance improvements
  • OpenJDK: Add support for CallerSensitive
  • OpenJDK: JSR 335: handle interfaces when resolving a method
  • OpenJDK: sun.misc.Unsafe: additional methods get/putAddress
  • OpenJDK: JSR 292: enable for OpenJDK 7/IcedTea 2
  • OpenJDK: JSR 335: invokeinterface check in method resolution
  • OpenJDK: JSR 335: implement "bridge" methods for Mirandas
  • OpenJDK: JSR 335: interface methods handle multiple defaults and conflicts
  • All: Fix invokesuper check in invokespecial opcode
  • OpenJDK: JSR 901: VM support for method parameter reflection
  • OpenJDK: JSR 335: VM support for lambda expressions
  • OpenJDK: Implement JSR 308: Type Annotations
  • All: Re-work internal storage of annotation data
  • OpenJDK: JSR 292: update intrinsic cache after GC compaction
  • OpenJDK: JSR 292: initMemberName: handle constructor
  • OpenJDK: JSR 292: implement MethodHandleNatives::expand
  • OpenJDK: JSR 292: resolveMemberName: throw LinkageError
  • OpenJDK: JSR 292: intercept LinkageError when linking callsite
  • OpenJDK: JSR 292: handle fields in findMethodHandleConstant
  • OpenJDK: JSR 292: enable only when configuring for OpenJDK8
  • OpenJDK: Implement fence methods in sun.misc.Unsafe
  • OpenJDK: JSR 292: implement intrinsic cache
  • OpenJDK: JSR 292: use internal opcodes for intrinsics
  • OpenJDK: Very simple field injection framework
  • OpenJDK: JSR 292 Lambda access control jtreg tests
  • OpenJDK: Garbage collector changes for JSR 292
  • OpenJDK: Yet more JSR 292 jtreg tests
  • OpenJDK: Set anonymous class protection domain
  • OpenJDK: JSR 292: all jtreg tests now pass
  • OpenJDK: First commit of OpenJDK8 JSR292 support (invokedynamic)
  • OpenJDK: Do not put version number in libjvm.so SONAME
  • All: Changes for Raspbian (Raspberry Pi)
  • All: Add extra compatibility options
  • All: When suspending, ignore detached threads that have died
  • All: Update stubs generator to handle ref returns
  • All: Ref return values from JNI methods need to handled specially
  • OpenJDK: Implement classlibCheckIfOnLoad() on OpenJDK
  • OpenJDK: OpenJDK 7: make thread states JVMTI compatible
  • All: Add OpenBSD/sparc to list of recognised hosts
  • All: Make command line compatibility options table-driven
  • OpenJDK: Skip Java-reflection-related DelegatingClassLoaders
  • All: Generic JNI stubs for common JNI method signatures
  • All: Add support for armhf
  • OpenJDK: Fix OpenJDK enclosingMethodInfo()
  • All: "Fix" handling of CLI bootclasspath options
  • All: Correct thrown exception by bootstrap loader
  • All: Fix threading of references list during compaction
  • All: Fix class GC with classes containing Miranda methods
  • All: Propogate initialisation errors to top-level
  • OpenJDK: Extra sun.misc.Unsafe functions
  • GNU Classpath: Fix VMThread.join
  • OpenJDK: Initial implementation of JVM_FindClassFromBootLoader
  • All: Fix callJNIMethod on i386 with -fomit-frame-pointer
  • All: Fix backwards cache conflict resolution code
  • All: Unify command line options parsing
  • OpenJDK: Implement remaining OpenJDK Array reflection interface
  • All: Base default min and max heap size on physical memory
  • OpenJDK: Fix reflective array access
  • All: Rewrite integer divide overflow check
  • OpenJDK: First set of changes to support JamVM/OpenJDK on MacOS X
  • All: Handle integer overflow on i386/amd64
  • All: On ARM, force interpreter to be built in ARM mode
  • All: MIPS: 64-bit and interpreter inlining by default
  • OpenJDK: Fix bug in JVM_NewMultiArray
  • All: JNI compatibility options and error printing
  • OpenJDK: Nasty compaction bug with OpenJDK classloader tables
  • All: Native return types smaller than an int must be handled specially
  • All: Add MIPS support for inlining
  • All: Update arm.h for ARMv7-A
  • All: Linux implementation of nativeJVMPath()
  • OpenJDK: Changes to VM to support different class-libraries
  • All: Fix for LNEG with stack-caching enabled on 32 bit machines (seen on ARM)
  • All: Fix for I2L on MIPS
  • All: Fix getMethodParameterAnnotations when there are no annotations
  • All: Fix constructorParameterAnnotations
  • All: Initial version of JNI stubs generator
  • All: Support for JNI stubs (signature specific fast invoke)
  • OpenJDK: Implement JNI RegisterNatives (first change for OpenJDK)
  • All: Add JNI 1.6 to supported versions returned by JNI onload

New in JamVM 1.5.4 (Apr 10, 2010)

  • GC changes:
  • Mark phase rewritten to use an explicit fixed-size mark stack,
  • with a moving heap scan pointer. The previous recursive marking
  • could lead to stack overflow when marking complex, deeply-linked
  • structures. If the explicit mark stack overflows, a slower,
  • fallback mechanism is used of scanning the heap. The new mark
  • phase is upto 50% faster than the old recursive marking.
  • bug fix for unallocated blocks within the heap of >= 1 GB.
  • JNI changes:
  • Updated to JNI version 1.6. This adds the function
  • GetObjectRefType().
  • Fully implemented JNI weak global references (NewWeakGlobalRef
  • and DeleteWeakGloablRef). Note, these are different to Java
  • Soft/Weak/Phantom References which have been supported since
  • JamVM 1.4.0.
  • verbose:jni now shows details of the opening of native libraries.
  • If a library fails to open a diagnostic message is shown (if
  • available). This is intended to help debug common library
  • problems.
  • bug fix for ToReflected[Method|Field] and GetSuperClass. A
  • local reference must be created for the return value.
  • Platform changes:
  • Interpreter inlining (aka code-copying JIT) now enabled by
  • default on ARM systems. Testing on Cortex-A8 indicates
  • 82% speed improvement on integer benchmarks, and 55% on
  • floating-point.
  • If cross-compiling, and interpreter inlining is enabled, runtime
  • relocation checks will be enabled (relocation information is
  • normally generated at compile time; as this can't be done
  • when cross-compiling it must be done at runtime, but it
  • increases the size of the executable by ~30%).
  • Initial port to Sparc/FreeBSD. My thanks to Per Ola Ingvarsson
  • for architecture dependent definitions. Interpreter inlining
  • (aka code-copying JIT) is currently not supported due to missing
  • code for flushing the instruction/data caches, and branch
  • generation. It also requires libffi, which is enabled by default.
  • Changes to x86 and x86_64 across all platforms to zero/sign
  • extend return values from native methods whose size is less
  • than an int (i.e. boolean, byte, char and short). This is
  • necessary due to changes in code produced by gcc >= 4.3.
  • Rare race-condition in thin-locking code on x86 and x86_64
  • architectures, leading to deadlock. On modern x86 CPUs, an
  • extra memory barrier is required. Seen intermittently while
  • running a thread intensive benchmark using at least 4 cores.
  • Extensive changes to support 64-bit Big Endian systems. These
  • were previously supported, but support was completely broken
  • with the introduction of the new object layout in JamVM 1.5.2.
  • Miscellaneous fixes:
  • Interpreter inlining bug fix: reference to memory after it
  • had been freed
  • java.lang.reflect.VMField getAnnotation() implemented. This
  • has been missing since the reflection rework in JamVM 1.5.2.
  • ThreadMXBean: fixes for getThreadInfoForId (VMThreadMXBeanImpl).
  • Did not correctly report lock or lock owner, when the thread was
  • blocked on an object which was thin-locked by another thread
  • It was using a constructor which has since been removed
  • Fixes for NULL handling in findClassFromSignature() and
  • utf8CharLen()
  • Fixed memory leak in bytecode rewriting. Due to missing
  • parantheses, old bytecode stream was not being freed (for
  • example, this leaks 47K when running "Hello, World")
  • Bug-fix for theoretical race-condition in thread deletion when
  • notifying joining threads after thread ID has been reused.

New in JamVM 1.5.3 (May 13, 2009)

  • Zip/Jar support in the boot classloader has been rewritten to no longer require the Zip/Jar files to be mmap-ed read/write. This increases shareability between multiple VM instances, and improves memory-usage on embedded systems.
  • JNI invocation API:
  • set thread-self to NULL when thread detaches (if the thread tries to re-attach, it appears to still be attached)
  • init args_count in dummy stack frame (fix problem if the thread detaches and then re-attaches)
  • Do not create a library unloader for libraries loaded by the bootstrap loader if they have an JNI_OnUnload method (the bootstrap loader is never unloaded, and so they will never be called). Fixes a SEGV with JRuby.
  • Fix to annotation handling. When the annotation value is an array, the native annotation parser constructs an Object array. However, the method return value is the specific type. This leads to an AnnotationTypeMismatchException. The fix coerces the Object array to the correct type.
  • Simple implementation of java.lang.management.VMManagementFactory (returns no memory pool, memory manager or GC names). Sufficient to run JRuby.
  • Implemented package support in the bootstrap class loader. Package information is obtained from the manifest file if it exists. However, GNU Classpath's glibj.zip's manifest has no package information. The class library is therefore recognised by the presence of java/lang/Object.class, and appropriate package information is constructed.
  • Fix broken implementation of VMClass.getSimpleName() (use the implementation from gcj)
  • Default Java stack size increased to 256K from 64K
  • Fix to bootstrap loader getResources() when the bootclasspath entry is relative (prepend the current working directory)
  • Fix minor memory leak in bootstrap loader getResources()
  • Add --enable-tls option to configure, enabling thread-local-storage (__thread) to be disabled

New in JamVM 1.5.2 (Feb 5, 2009)

  • Interpreter inlining changes
  • Basic-blocks are now inlined across block boundaries removing the need for dispatching between blocks in the case of fall-through control flow
  • Control-flow within inlined sequences now patched with real jumps, removing the need for computed jumps
  • Control flow between non-shared sequences now patched, replacing dispatch with real jumps
  • Simple basic-block profiling is now implemented. This considerably reduces the size of the code-cache, without reducing performance
  • Reworked Object layout
  • Previously, on 64-bit machines the object layout was wasteful, with padding on fields less than 64-bits (to preserve 64-bit alignment). The new object layout on average reduces heap usage by approx 10 - 15%
  • On 32-bit machines, 64-bit fields are now 64-bit aligned (without introducing extra padding if possible)
  • Various alignment fixes
  • 64-bit alignment of operand stack64-bit alignment of static variable data
  • Reflection support
  • Reworking required for new object layout
  • Reworked to use VMConstructor, VMMethod, etc.
  • Reworked to improve field access and method invocation performance (this offsets the extra costs of the VM interface, and improves performance over 1.5.1).
  • Access permission checks take precedence over other errors
  • Class/method signatures : do not convert slash to dots
  • JNI fixes/improvements
  • Class references returned by JNI now use local references
  • Throw InstantiationException not InstantiationError when allocating objects and the class is an interface or abstract
  • Reworked JNI global references
  • Fix memory leak when expanding list
  • Improve performance (optimise case where references are created/deleted in a stack-like manner)
  • OpenSolaris/Solaris/x86 port
  • GC fixes
  • Fix race-condition in registering references with the GC
  • Separate "Async GC" thread is now disabled by default. It didn't improve performance, and could increase power-consumption on embedded systems
  • Exception handling
  • Fix method-skipping when filling in stack trace (methods could be incorrectly excluded from the trace when a class subclassed Throwable)
  • Uncaught exceptions in the "main" thread will now use the thread's uncaughtExceptionHandler
  • Various compatibility command line options recognised (and ignored). These include -XX:PermSize and XX:MaxPermSize required to build OpenJDK.
  • sun.misc.Unsafe
  • Object methods (compareAndSwapObject, etc.) fixed on 64-bit machines
  • Implemented support for thread park and unpark (removing previous highly inefficient "empty" implementation)
  • Use thread-local storage (__thread), if available, instead of pthread keys
  • Various minor race-conditions seen while running Dacapo benchmarks
  • Strict-aliasing fixes when compiled with GCC 4.3, interpreter stack-caching is enabled, and interpreter inlining is on
  • A large amount of code-tidying throughout the VM
  • Minimum heap size increased to 16MB
  • Various compiler warnings.