8.0 (Release 8)

  • JAM-4670: For 32-bit QNX, improved wait functions that delay for an absolute time to work beyond 19 Jan 2038 (until 7 Feb 2106).

  • Fix AMS-656: VM crashes after UnsatisfiedLinkError thrown when loading code from an accelerated JAR.

  • Fix JAM-4668: Multicore VM could segfault in a low memory situation.

  • Fix JAM-4640: ModuleLoader throws IllegalArgumentException if CodeSource.getLocation() of classes loaded from a JAR returns a relative path.

  • The Jamaica C Compiler Ant Task has been extended to support sets of source files (JAM-4654).

  • Fix JAM-4653: compilerflags and linkerflags attributes of the respective Jamaica Ant Tasks were not usable.

  • Fix JAM-4643: Possible deadlock in String.intern() during class linking.

8.0 (Release 7)

  • Fix JAM-4535: Wrong code generated for synchronized methods when setting the Builder and JAR Accelerator option -ssa to 'true'.

  • Fix JAM-4610: Compiled code caused crashes on single-core VM when using more than 255 Java threads.

  • Fix JAM-4541: Fix live-lock in multicore scheduler that could cause the VM to halt until the next time slice.

  • Fix JAM-2814: When setting one of the Builder options -setFonts, -setLocales or -setProtocols to 'all', this was not replaced by all possible values for the option. The string 'all' has been used as font, locale or protocol name, respectively.

  • Fix JAM-4559: Failed assertion when calling getUptime() on RuntimeMXBean.

  • Fix JAM-3942: Fix setting of CPU affinities on QNX.

  • Avoid unnecessary priority boosting of current thread.

8.0 (Release 6)

  • Fix JAM-4526: Class loading within ScopedMemory could corrupt class data resulting in crashes.

  • Fix JAM-4487: java.lang.Package did not provide the information from META-INF/MANIFEST.MF for classes from the boot class path.

  • Fix JAM-4522: Warnings are printed that native methods cannot be found, though the methods (or classes) are passed to the -XloadJNIDynamic Builder option.

  • Profile used to create the optimized "jamaicavm" command is now based on the OpenJDK version jdk8u102. This could improve the performance of applications.

  • Fix JAM-4466: Parallel class loading using several threads to load the same class hierarchy with classes from different class loaders could result in a SEGFAULT.

8.0 (Release 5)

  • Fix JAM-4463: A thread’s priority is no longer boosted to the next higher native priority if that thread is in JNI code.

  • Fix JAM-4459: The VM verbosity when loading accelerated code has been improved. A new property has been implemented (jamaica.jaraccelerator.debug.class).

  • Fix JAM-4448: When loading at runtime accelerated code multiple versions of the same library could be extracted and remain in a running system without being reused. A new property has been implemented (jamaica.jaraccelerator.extraction.dir) for configuring the how and when these libraries should be extracted and deleted.

  • Fix JAM-4432: Fix crash when calling Unsafe.object/staticFieldOffset(null).

  • Fix JAM-4439 and JAM-4008: Crashes and missing synchronization when using the (unsupported) Java management API.

  • Fix JAM-3838: VM could segfault instead of throwing proper exception (e.g. ClassNotFoundException), during constant pool resolution.

  • Fix JAM-4208: When a high priority thread with CPU affinity was started from a low priority thread, a priority inversion bug could lead to starvation of the high priority thread.

  • Fix JAM-4377: Ensure proper security checks for boot classes.

  • Jamaica is now based on standard classes of OpenJDK version jdk8u102-b14.

  • Fix JAM-4409: When the -autoSeal option was true, the JAR accelerator used to override the existing per package based sealing by true. The correct is to consider a package from the JAR sealed unless a package based seal says otherwise.

  • Fix JAM-4405: JamaicaTrace is very slow when displaying large traces. Large traces are now drawn quickly even when using a large scale, e.g., after selecting "Navigate/Fit Window" or "Navigate/Fit Width".

  • Fix JAM-4400: Thread running as least eligible thread causes thrashing with memory reservation thread. A thread that was set to be least eligible will cause poor performance due to frequent thread switches with the MemoryReservationThread if it allocates memory. This affects threads after a call to com.aicas.jamaica.lang.Scheduler.setLeastEligible(), which is done for threads with javax.realtime.ProcessingGroupParameters when in a cost overrun situation and boolean property jamaica.cost_enforcement is set.

  • Fix JAM-4383: Bytecode verifier was very slow when verifying certain classes with a large number of try/catch blocks with different local variables.

  • Fix JAM-4394: Builder dependencies for java.text.BreakIterator were missing.

  • Fix JAM-4352: Property "javax.realtime.version" is set correctly to 1.0.2. Available Affinity methods from RTSJ 2.0 that are available already can be disabled by setting the property "javax.realtime.disable_new_rtsj_apis" to true.

  • Fix JAM-2267: The jamaicah tool now creates C header files for direct inner classes of the classes given as arguments to this tool.

  • Improved readability of warnings displayed by the accelerator. Now, when accelerating using verbose level 2, only warnings for classes from the accelerated JAR are displayed.

  • Fix JAM-4368: JAR accelerator might throw java.util.zip.ZipException when copying entries from the source JAR to the destination JAR.

  • New Ant task for invoking the Jamaica JAR Accelerator.

8.0 (Release 4)

  • JAM-4193: The full stack trace of all Java threads is now printed if the VM receives POSIX signal SIG_QUIT twice within 500ms.

  • Fix JAM-2068: Standard charset classes (sun.nio.cs.*) are now included automatically by the Builder tool.

  • JAM-4268 and JAM-4269: Added new APIs to com.aicas.jamaica.lang. AllocationHandler to determine the memory occupied by one object (method getObjectSize) and to run a partial garbage collection cycle (method partialGC).

  • The libffi bundled with Jamaica was updated to version 3.2.1. Dynamic library loading on ARM with hardfloat ABI is now supported.

  • Fix JAM-4097, JAM-4090: fix RealtimeThread.sleep(RelativeTime) to behave as specified in the RTSJ.

  • Jamaica is now based on standard classes of OpenJDK version jdk8u92-b14.

  • The option -Xcheck:jni (for the VM commands) and -Xcheck=jni (for the Builder) now causes the VM to report illegal JNI calls made with exceptions pending and to exit.

  • Fix JAM-4165: In built applications, the VM no longer adds the current directory to the application class path. Property java.class.path is now unset for a built application instead of being "". It can, however, be set via the builder commands -XdefineProperty and -XdefinePropertyFromEnv. This fixes a potential security issue since built applications could load class files stored from the current directory or sub-directories.

  • Fix JAM-4015: MethodHandleNatives.getMembers() returned the wrong kind (JVM_REF_invokeSpecial) for private methods.

  • Fix JAM-4182: An assert failed in jamaicavmdb if JNI’s Get/Set<type>ArrayRegion was called with NULL as the array argument.

8.0 (Release 3)

  • Improved JNI call performance when the native library is loaded at runtime and not linked at build time.

  • ByteBuffer (NIO) arrays are transferred in parallel if possible.

  • Fix JAM-4122: Calls to methods in java.lang.Compiler no longer result in an UnsupportedOperationException.

  • Jamaica now supports a configuration for Raspberry 2.

  • Fix JAM-4144: There was a leak of system memory when dynamic thread creation failed due to Java heap fragmentation. This could occur only when the maximum number of threads was larger than the initial number of threads and threads were added dynamically in a situation when the Java heap was fragmented. Repeated attempts to create additional threads resulted in unbounded system memory usage.

  • Fix JAM-4078: On QNX, for applications using com.aicas.jamaica.lang.CpuTime (which is the basis for cost budget measurment in the RTSJ), the CPU clock rating is now obtained from the OS, it is no longer measured. Hence, it is no longer required to set the property jamaica.cpu_mhz.

  • In an old internal native interface (Jamaica Binary Interface, JBI), macros JBI_THROW* and JAMAICA_JBI_COPY have been removed from the corresponding include file jbi.h. JBI is deprecated, jbi.h will be fully removed in a later release.

  • Add JAM-4078: new QNX cycle counter rate read feature A new feature has been added for the QNX systems, it allows to read the cycle counter rate (in KHz) of the hosting platform. This feature is now used to initialize the CPU_RATE constant in CpuTime class in case the OS is a QNX system.

  • Fix JAM-4058: waitForNextRelease in non-periodic RealtimeThread The modification moves the invocation of activateMissAndOverrunHandlers() method for the non-periodic RealtimeThread in the release() method. This change is necessary because for non-periodic RealtimeThread the release time is only known when the release() method is called.

8.0 (Release 2)

  • Fix JAM-4123: A compiled synchronized method caused a crash if entering the monitor failed (e.g., due to a nest count overrun).

  • The Freetype library bundled with Jamaica was updated to version 2.6.3.

  • Jamaica now based on standard classes of OpenJDK version jdk8u72-b15.

  • Support for Compact 2 Profile of the standard classes.

  • Fix JAM-3898: Graphics.drawImage() doesn’t handle background color and transparency.

  • Fix JAM-2515: InetAddress.getAllByName() returns duplicates.

  • Multiple small fixes in the RTSJ implementation.

  • Fix JAM-4072: Native thread names of JamaicaVM are sometimes corrupt on QNX.

  • Large file support on 32 bit systems.

  • Support for InetAddress.getCanonicalHostName() on QNX.

  • Support for IPv6 multicast on Linux.

  • Fix JAM-4117: Protect newly allocated object from GC while calling Finalizer.register(). This bug could result in the referenced memory being reclaimed and reused for other allocations.

  • Fix JAM-4110: Determination of GC start time (to be used by sun.misc.GC.maxObjectInspetionAge) is no longer performed by the GC code itself, but by the ReferenceHandler thread. This avoids potential bad worst-case exectution times due to system calls to read the clock when performing GC work by any thread.

  • Fix JAM-3491: Several issues with respect to clocks have been fixed. JamaicaVM now internally distinguishes three clocks: realtime clock, standard clock and relative clock.

    The realtime clock javax.realtime.Clock.getRealtimeClock() is mapped to CLOCK_MONOTONIC on POSIX systems. Consequently, any RelativeTime or AbsoluteTime instances use this clock, as well as all services built upon these (RTSJ Timers, periodic RealtimeThreads, deadlines, etc.). At VM startup, the difference between this clock and the standard clock (used for System.currentTimeMillis()) is determined, this offset will be added to the milliseconds value of AbsoluteTime values. Consequently, AbsoluteTime equals the standard clock as long as the standard clock and the realtime clock remain in sync.

    For non-RTSJ code, absolute times relative to the epoch (1st of January 1970) are managed by the standard clock. On POSIX systems, this clock is implemented using CLOCK_REALTIME. It may suffer from arbitrary jumps as a result of time or calendar changes. The standard clock is used for System.currentTimeMillis, java.time.Clock, java.util.Date, sun.misc.Unsafe.park() with an absolute time (package java.util.concurrent is based on this), etc.

    For non-RTSJ code, relative times are managed by the relative clock. On POSIX systems, this clock is selected via the Builder option -XuseMonotonicClock. The default (true) selects CLOCK_MONOTONIC, while false selects CLOCK_REALTIME. CLOCK_MONOTONIC is preferred since it usually does not jump abruptly. The relative clock is used for Object.wait, Thread.join, Thread.sleep, sun.misc.Unsafe.park() with a relative time (package java.util.concurrent is based on this), sun.misc.GC.maxObjectInspetionAge, and VM internal timeouts as for interrupting blocking I/O.

    In summary, JamaicaVM uses the following clocks:

    VM clock        POSIX implementation
    realtime clock  CLOCK_MONOTONIC
    standard clock  CLOCK_REALTIME
    relative clock  CLOCK_MONOTONIC/CLOCK_REALTIME, dep. on -XuseMonotonicClock
  • Fix JAM-4107: Possible illegal monitor state if thread blocked in Object.wait() receives both a Thread.interrupt() and a Thread.notify().

  • Fix JAM-4098: Possible assertion failure when new GC cycle starts in debug VM.

  • Fix JAM-4081: Services such as ThreadPoolExecutor from package java.util.concurrent used to run in endless loops when interrupted via RTSJ’s javax.realtime.AsynchronouslyInterruptedException since this code is itself not asynchronously interruptible, but at places catches InterruptedExceptions in endless loops, which does not work for AsynchronouslyInterruptedException, which remains pending and will be thrown again on the next Object.wait or Unsafe.park. Now, this code throws an com.aicas.jamaica.lang.AsynchronouslyInterruptedError instead.

  • Fix JAM-4068: Fixed a failed assertion when running a large application built using the Builder with option -debug=true.

  • Fix JAM-4048: System.nanoTime() on POSIX system now uses POSIX' CLOCK_MONOTONIC (instead of CLOCK_REALTIME).

  • Fix JAM-4028: Added JNI function GetObjectRefType. JNI version has been set to JNI_VERSION_1_6. Support for JNI code in static libraries, which is required by JNI_VERSION_1_8, is still missing (JAM-4039).

  • Fix JAM-3869: Fixed several cases that should have resulted in an IncompatibleClassChangeError but that instead caused the VM to crash (e.g., invoking an abstract method via invokestatic).

  • Fix JAM-4017: Implement access checks for java.lang.invoke.MemberName resolution.

  • Fix JAM-4035, JAM-3916: Pipes created for java.lang.UNIXProcess caused IOExceptions when they were closed since they had not beed added to the VM internal resource handling.

  • Fix JAM-4030: Opening files via java.io.FileInputStream, java.io.FileOutput- Stream or java.io.RandomAccessFile resulted in a memory leak of 128 bytes per file on the Java heap.

  • Fix JAM-4029: Allocation of non-Java heap memory could break realtime behaviour: a short priority inversion could occur in case a low priority thread called a native method that required the allocation of system memory (e.g., via JNI’s GetByteArrayElements()). The result was that higher priority threads could be prevented from running until the allocation call (usually malloc()) completed.

  • A timeslice that is specified via an environment variable can now use the same units provided by the Builder’s '-timeSlice' option: 'ns', 'us', 'ms', or 's'. The environment variable is provided via the Builder’s option '-timeSliceFromEnv' or, for the jamaicavm* commands, using the variable 'JAMAICAVM_TIMESLICE'.

  • Fix JAM-3999: A race condition in the parallel GC caused the reclamation of memory that is still reachable, which may result in segfaults or arbitrary behaviour. A situation in which several threads in parallel allocate objects and immediately exchange references to these objects (e.g., via adding elements to a java.util.concurrent.ConcurrentLinkedQueue) while a new GC cycle is starting could result in the GC falsely reclaiming the memory of some of these objects.

  • Fix JAM-3452: When using dynamic heap expansion (heapSize is less than maxHeapSize) and contiguous memory to allocate a new array is not available, the heap is expanded more aggressively now to increase the chances to obtain a contiguous array. The heap is expanded if the free memory is less than 33% of the current heap size for the single core VM, and less than 25% for the multicore VM. This results in better out-of-the-box performance for accesses to arrays allocated during application startup. However, for production, it is recommended to initially set heapSize and maxHeapSize to the same value and avoid fragmentation due to incremental heap expansion.

8.0 (Release 1)

  • Support for new features of the Java 7 and 8 platforms including the invokedynamic bytecode, lambda expressions, default methods, streams APIs, the Compact 1 Profile of the standard APIs.

  • Build based on standard classes of OpenJDK version jdk8u66-b17.

  • The flat directory layout of the Jamaica runtime system, where VM executable and rt.jar could reside in the same folder, is no longer supported. When deploying a VM on a target device, the structure of bin/ and lib/ folders needs to be preserved.

  • Fix JAM-3381: PeriodicTimer.createReleaseParameters() throws IllegalStateException when the timer is not active.

  • Fix JAM-3876: PeriodicTimer.getInterval() should not return null. This was the case if the interval was set to null. A RelativeTime instance with 0 ms and 0 ns is returned instead.

  • Added basic type inference classfile verifier. This is currently limited to pre Java-6 style data flow analysis of the bytecode, no other checking (such as verification of indices and offsets for legal values) is done.

  • Ensure that when jamaicah fails, it returns a nonzero exitcode.

  • Multicore support on the host (Linux) is only provided if the target platform has multicore support. Only then is the default of the Builder and the JAR Accelerator option -parallel set to "true".

  • The Java system property "file.encoding" is now set to the standard encoding of the operating system.

  • Support for the Java system properties "user.country", "user.script", "user.variant" and "user.language".

  • The VM now supports the -verbose:class option for tracing of class loading.

  • Support for Socket.getSendBufferSize() and setSendBufferSize() on PikeOS.

  • Fixed limitations section in manual: maximum heap size is 64GB for 64 bit VM due to the use of signed 32 bit arithmetic.

  • Fix JAM-3694: An exception in the static initializer of a super class of the main class caused a segmentation fault.

  • JAM-3580: The JAR Accelerator now supports compiling signed JARs. To ensure that the compiled code is not modified later, the JAR has to be signed again.

  • Stabilization of the JAR Accelerator.

  • Fix JAM-3487 and JAM-3507: Performance loss in micro benchmarks and assertion failure in debug VM. The problem was gradual loss of performance in a long running application and increase of object allocation time.

  • Fix JAM-3490: Jamaica does not return the correct time zone (Linux). The time zone of the system could always be detected.

  • Dropped obsolete 'jamaica' script.

  • JAM-3541: avoid endless loop in case of Async interrupt if handler PC is within exception range.

  • Support for QNX 6.6 on ARM and x86 architectures.

  • Use rmic stubversion 1.2 for RMIServerImpl and RMIConnectionImpl skeleton to be compatible with JDK 1.5 and later.

  • Renamed jamaicah environment variables to JAMAICAH_HEAPSIZE and JAMAICAH_MAXHEAPSIZE.