6.4 (Release 6)

  • Fix JAM-4674: The 'java.home' property was not always detected correctly on Windows and Windows CE when the Builder was used. This caused also that some messages were not printed in the Apache Commons Logging component.

  • Fix JAM-5317: Allocating native memory (via ByteBuffer.allocateDirect(), java.awt.Window.pack(), etc.) could segfault in low memory situations. This was addressed by improved error handling of java internal API Unsafe.allocateMemory().

6.4 (Release 5)

  • Fix JAM-5285: Display artifacts in an HTML help page with Thai fonts.

  • Fix JAM-5284: NullPointerException when the glyph array had to be increased, e.g. when using Thai fonts.

  • Fix JAM-5269: Worst-case execution time of an allocation could be arbitrarily large if many active weak/soft/final/phantom references were present.

  • Fix JAM-5256: Improve robustness of java.security.AccessController in low memory situations.

  • Fix JAM-5190: Only Latin letters are shown when mixed with Thai text.

  • Fix JAM-5030: For synchronized native methods built in by the Jamaica Builder, synchronization was missing causing race conditions in code that seemed properly synchronized.

  • Improve thread yields on Windows CE.

  • Fix JAM-4801: Interrupting a thread T by throwing RTSJ’s Asynchronously- InterruptedException could result in T hanging in endless loop.

  • 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 JAM-4690: Native library loading fails on Windows 7.

  • 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-4610: Compiled code caused crashes on single-core VM when using more than 255 Java threads.

  • Fix JAM-2246: Setting a directory to read-only on Windows will always fail, as all directories have read and write access (since Windows XP).

  • 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-4522: Warnings are printed that native methods cannot be found, though the methods (or classes) are passed to the -XloadJNIDynamic Builder option.

  • Example for dynamic library loading for Linux x86 and x86_64 configurations.

6.4 (Release 4)

  • 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.

  • 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-3524: Segmentation fault on VxWorks 6.9 ARM RTP. This could be solved by an update of the Wind River toolchain.

  • Fix JAM-4451: Synchronization thread does not run at the priority specified by the priority map (on systems where SCHED_OTHER is not mapped to 0).

  • Fix JAM-4392: Provide the number of bytes that can be read from a socket on PikeOS. This is used e.g. by java.net.Socket.getInputStream().available().

  • Fix JAM-4434: Replace VxWorks 7.0 toolchain paths in jamaica.conf with paths that use the WIND_HOME environment variable.

  • 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-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.

  • 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.

  • Add support for dynamic library loading for VxWorks 7.0 and later.

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

  • 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-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.

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

  • 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-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.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-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-3968: A bootstrapping issue observed when invoking JamaicaVM from Gradle resulting in a NullPointerException in ClassLoader.

  • 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.

  • 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.

6.4 (Release 3)

  • 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.

  • Support for PikeOS 3.5 ARMv7.

  • Fix JAM-3825: When FindClass was called through the Invocation Interface to find application classes, NoClassDefFoundError was thrown.

  • Fix JAM-3841: Garbage instances of java.lang.Reference were not reclaimed by the GC after being cleared and enqueued if some of the Reference instances cleared in the same GC cycle were reachable.

  • Support for environment variables on PikeOS. Because environment variables set from the outside cannot be read, JamaicaVM accepts PikeOS string properties as environment variables. See manual for details.

  • Fixed JAM-3809: Incorrect code generated by the rule based compiler (builder option '-ssa') for throwing exception in nested try catch blocks.

  • Fixed JAM-3807: Incorrect optimization performed by the rule based compiler (builder option '-ssa') for zero in double arithmetic.

  • Fixed JAM-3778: Incorrect stack overflow detection for JNI attached threads.

  • Fixed JAM-3776: Incomplete cleanup for JNI detached threads resulted in errors trying to set the priority of these threads.

  • Fix JAM-3751: JVMTI: The VM was ignoring a breakpoint if it was set on the first line of the main method and if the class contained any static variable initialization.

  • 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 int32 arithmetic.

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

  • JAM-3683: Fixed seldom ConcurrentModificationException in Builder during class loading.

6.4 (Release 2)

  • 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 a very slow performance loss in a long running application resulting in gradually 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.

  • Support for Windows Embedded Compact 2013 (ARM).

  • Support for QNX 6.6 on ARM and x86.

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

6.4 (beta)

  • Experimental version of the JAR Accelerator tool to improve the performance of JAR libraries loaded at runtime by statically compiling bytecode contained in the JAR into machine code (Linux and QNX).

  • Support for strict RTSJ compliance (Builder options -strictRTSJ and -lazy) has been made internal. Strict RTSJ imposes significant restrictions and makes Jamaica incompatible with many libraries. Users who require strict RTSJ should contact aicas for assistance.

  • Dropped --help and --Xhelp aliases for the help options of the Builder and Jamaicah. -help (or -h or -?) and -Xhelp may be used instead.

  • Support for VxWorks 7.0.

  • Builder option -incrementalCompilation is deprecated. Deactivating incremental compilation is not recommended. Each Java package should be compiled separately and only recompiled if necessary. To force recompilation, the temporary directory (set with -tmpdir) can be removed.

  • Deprecated Builder options -cdc and -cldc have been removed.

  • Parsing of command line options by tools such as the Builder is now case-sensitive (JAM-3081). Potential incompatibility.

  • JAM-3237: Full-screen support (Windows CE). The windows are set the topmost when they become visible. Previously, when a window was created with the size of the screen, this window fell behind the taskbar.

  • Fix JAM-3150: Segmentation fault when taking a screenshot (Windows). The platform-specific peer implementation used by Component.createImage() did not support all available color models.

  • JAM-2940: Disable caching of the last used sun.awt.AppContext element. This fixes AWT-related ClassCastExceptions observed on Windows CE and VxWorks devices.

  • Fix JAM-2855: Default component does not get the focus (AWT and Swing).

  • Fix JAM-3199: Socket.connect() does not support a timeout on OS-9.

  • Support for Intel Galileo board.

  • Fix JAM-3106: java.util.regex.Pattern.compile() took very long for large regular expressions. The reason was very inefficient codepoint handling in Java strings, which was fixed.

  • Basic support for inter-partition communication on PikeOS. Queuing ports and sampling ports can be accessed via java.io.File. Shared memory objects can be accessed via java.nio.channels.FileChannel.map(). See manual for details.

  • The Finalizer thread has been split up into two threads: The Finalizer thread that executes finalize methods and a Reference Handler that clears and enqueues instances of java.lang.ref.Reference. This means that all applications will require one additional thread.

  • New properties jamaica.finalizer.pri and jamaica.reference_handler.pri to set priorities of Finalizer thread (default is 8) and Reference Handler thread (default is 10).

  • Fix JAM-1623: Unreachable cycles of SoftReference are now recycled immediately when the cycle has been detected to be unreachable, this is no longer delayed until the free memory drops blow the threshhold for soft references to be cleared.

  • Support for PikeOS 3.5 (PPC).

  • JAM-3063: The Jamaica Tools Ant tasks now use a clearer XML syntax for their option definition that separates the namespace of Ant task option names from the namespace of tool option names. Example: old: <target value="linux-x86_64"/> new: <option name="target" value="linux-x86_64"/>

  • Fixed native functions to get host by address (VxWorks, PikeOS). As a result InetAddress.getCanonicalHostName() now returns a host name, if known, instead of an IP address.

  • Tool option -useProfile now supports profiles compressed as GZIP files and ZIP archives containing several profiles.

  • For consistency with the other VM options, the syntax of the -XprofileFilename option was changed from -XprofileFilename <file> to -XprofileFilename:<file>.

  • Fix JAM-3199: Socket.connect() does not support a timeout on OS-9.

  • Fix JAM-3054: Wrong exitcode when application terminates with java.lang.Error. When the application terminates with a pending Java exception or error, always the exitcode 1 will be returned.

  • The system property "os.arch" is "amd64" on x86_64 targets.

  • Fix JAM-3212: Only the X509 trust manager is available on Windows.

  • Support for setting native thread names on Linux, VxWorks and QNX.

  • Jamaica_appletviewer and jamaica_remoteprofile have been renamed to jamaicaappletviewer and jamaicaremoteprofile for consistency with other commandline tools.

  • The GC thread and the property jamaica.gcthread_pri have been deprecated. Memory reservation should be used instead. See Section 7.1.4 on reserved memory in the user manual.

    The advantage brought by the GC thread is very small compared to the memory reservation thread. The GC thread may increase the amount of free memory earlier, resulting in slightly less GC work required per allocation (this work is proportional to the inverse of the fraction of free memory), while the memory reservation thread completely avoids GC work at allocation time. The disadvantage of the memory reservation thread is that the maximum reserved memory must be considered allocated when determining the worst case amount of GC work on allocation.

    If desired, a background GC thread can be implemented as follows:

    new Thread()
        public void run()
          /* we do not care if this thread starves */
          /* let other threads with priority 1 run first */
          Runtime rt = Runtime.getRuntime();
          while (true)
              // optional Thread.sleep() to avoid 100% CPU usage.
  • Fix JAM-3083: Fixed access checking for unaccessible members of other classes.

  • All POSIX mutexes use the priority inheritance protocol.

  • Fix JAM-2992: Compiled package file name is shown twice (Windows). The standard output of the native toolchain called by the Builder is now only shown if the verbosity level of the Builder is 2 or higher.

  • The parallel VM now uses concurrent garbage collection by default. This means there is one low-priority memory reservation thread per CPU.

  • Allow "default" as value for properties jamaica.java_thread_default_affinity, jamaica.heap_so_default_affinity, jamaica.noheap_so_default_affinity and jamaica.processing_group_default_affinity.

  • Fix JAM-3051: Exception handling in mixed compiled / interpreted code wrong. In some rare cases of nested calls between compiled and interpreted methods, an exception could end up being handled by the wrong exception handler or falsely passed to the caller.

  • Speed up building with -jobs on Windows.

  • Fix JAM-3026: Occasional SEGV when dynamically adding threads in parallel VM. Dynamically adding threads could result in memory being freed too early. This situation may occur when the argument provided to the builder option -numThreads or the VM environment variable JAMAICAVM_NUMTHREADS is less than the value provided to -maxNumThreads or JAMAICAVM_MAXNUMTHREADS, respectively.

  • Fix JAM-3034: Parallel VM occasionally deadlocks after last non daemon thread terminated. Due to a race condition, VM termination was not guaranteed if several threads were started or terminated simultaneously. In principle, this problem could also have lead to early VM termination.

  • Fix JAM-2945: Extremely poor scheduling with affinities: Thread migration caused by explicitly setting of affinities for a Java thread could result in a temporary life-lock until the target CPU is idle.

  • Fix JAM-2993: Adding and removing root references caused 32 bytes of memory to leak. Root references are created, e.g., when Java threads are started or via JNI’s NewGlobalRef function.

  • Fix JAM-2987: Touch inputs are not received by Jamaica (WindML).