|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: JRuby 10.1.0.0 Released |
| 4 | +--- |
| 5 | + |
| 6 | +The JRuby community is pleased to announce the release of JRuby 10.1.0.0. |
| 7 | + |
| 8 | +* Homepage: [https://www.jruby.org/](https://www.jruby.org/) |
| 9 | +* Download: [https://www.jruby.org/download](https://www.jruby.org/download) |
| 10 | + |
| 11 | +JRuby 10.1.0.x targets Ruby 4.0 compatibility. |
| 12 | + |
| 13 | +Thank you to our contributors this release, you help keep JRuby moving forward! |
| 14 | + |
| 15 | +JRuby 10.1: Experimenting and Evolving |
| 16 | +====================================== |
| 17 | + |
| 18 | +JRuby 10.1.0.0 is our first major release since catching up with Ruby compatibility. We have used this opportunity to explore many experimental optimizations and improvements we have been chasing for many years. Ruby 4.0 compatibility is largely complete, but there will be additional features added in update releases. We also plan to continue with large scale experiments in subsequent updates, and recommend production users continue to use JRuby 10.0 while we work toward stabilization of the 10.1 series. |
| 19 | + |
| 20 | +Here's an overview of the major enhancments already in JRuby 10.1.0.0 and others planned for update releases in the coming months. |
| 21 | + |
| 22 | +Reduced Object Size |
| 23 | +------------------- |
| 24 | + |
| 25 | +In JRuby 10.1 all objects have been reduced in size by 8 bytes, bringing the base object size down from 32 bytes to 24 bytes. This translates into smaller objects across the system, reduced GC load, higher allocation throughput, and better cache locality. |
| 26 | + |
| 27 | +On JVM versions that support Compact Object Headers (JEP 450: "Project Lilliput") the base object size can be further reduced to 16 bytes, 40% smaller than objects in the standard Ruby implememtation. |
| 28 | + |
| 29 | +Evolving Strings, Arrays, and Hashes |
| 30 | +------------------------------------ |
| 31 | + |
| 32 | +During the upcoming JRuby 10.1 update releases, we plan to introduce new versions of String, Array, and Hash that are optimized for memory compactness, concurrency, or integration with other JVM languages. To support these features, we have made the internal implementations RubyArray and RubyHash into abstract classes and deprecated the direct constructors for RubyString. Please test your JRuby extension code and make sure it does not call abstract or deprecated constructors. |
| 33 | + |
| 34 | +Smaller Numeric Representations |
| 35 | +------------------------------- |
| 36 | + |
| 37 | +JRuby's internal class for representing 64-bit signed Integer values, RubyFixnum, has been split into two versions: LongFixnum and ShortFixnum. Combined with the reduced size of objects overall, this reduces the size of these long and short-ranged Integer objects from 40 bytes to 32 bytes or 24 bytes (24 bytes or 16 bytes if using Compact Object Headers). The size of Float objects have similarly been reduced from 40 bytes to 32 bytes. These size reductions help improve the performance of numeric algorithms and reduce impact to the heap and GC of boxing numeric values. |
| 38 | + |
| 39 | +Cross-platform Prism Parser |
| 40 | +--------------------------- |
| 41 | + |
| 42 | +JRuby 10.1 ships with support for the Prism Ruby parser, packaged as a set of pre-optimized native builds (for Windows, Linux, and MacOS on x86_64 or arm64) or as a WASM build on other platforms. We're still working out a few remaining features, but we encourage experimenters to enable it by passing `-Xparser.prism` to JRuby. We plan to make this the default parser once the remaining issues are solved. |
| 43 | + |
| 44 | +Direct Argument Passing |
| 45 | +----------------------- |
| 46 | + |
| 47 | +We have also laid the groundwork to start passing all forms of method arguments on the call stack, avoiding boxed collections for most optional and keyword arguments. In upcoming JRuby 10.1 releases, we will begin to connect these call paths up for both pure-Ruby and native (Java) method targets, eliminating box allocation and drastically improving the peformance of such forms. Watch this space for rapid improvements. |
| 48 | + |
| 49 | +New Policy for EOL and LTS Releases |
| 50 | +----------------------------------- |
| 51 | + |
| 52 | +With the release of JRuby 10.1, we are moving JRuby 9.4 into a "soft" EOL status. This means we will no longer be doing regular OSS release updates of JRuby 9.4, but users may get in contact with us to sponsor continued support. JRuby 10.0 will be our stable LTS release until April 2028 and we recommend all users upgrade or get in contact with us for assistance. JRuby 10.1 will be our "tip" release line, with many exciting optimizations and enhancements due to land over the next several months. |
| 53 | + |
| 54 | +Going forward, we will provide a new LTS baseline release every two years, starting in spring of 2027, and alternating years will be considered as edge or development versions without LTS guarantees. This will allow us a free hand to keep bringing you more experimental features while still providing a stable baseline for more conservative users. |
| 55 | + |
| 56 | +Try JRuby Today! |
| 57 | +---------------- |
| 58 | + |
| 59 | +Users can install JRuby 10.1 through the usual means, and we encourage you to give it a try and let us know how it handles your applications and libraries. We have much more planned for the 10.1 updates and hope to move fast and push the edges of what's possible with Ruby on the JVM. |
| 60 | + |
| 61 | +### 59 Issues and PRs resolved for 10.1.0.0 |
| 62 | + |
| 63 | +- #8716 [dup a lot][#8716] |
| 64 | +- #8747 [Launcher script chokes on GraalVM release file][#8747] |
| 65 | +- #9055 [Array experiments][#9055] |
| 66 | +- #9066 [Move Set to a core class [Ruby 4.0]][#9066] |
| 67 | +- #9069 [Implement Ruby 4.0 support][#9069] |
| 68 | +- #9074 [Avoid array allocation for *nil, by not calling nil.to_a][#9074] |
| 69 | +- #9075 [Selective inspect of instance variables][#9075] |
| 70 | +- #9077 [No numbered parameters in Binding#local_variables][#9077] |
| 71 | +- #9078 [Add Math.{expm1,log1p}][#9078] |
| 72 | +- #9079 [Align IO.select timeout logic with CRuby][#9079] |
| 73 | +- #9083 [Implement missing raise features][#9083] |
| 74 | +- #9085 [Specialize Fixnum][#9085] |
| 75 | +- #9090 [Reduce the size of the varTableStamp][#9090] |
| 76 | +- #9091 [Shrink varTableStamp][#9091] |
| 77 | +- #9095 [Eliminate global flags][#9095] |
| 78 | +- #9096 [Cache object ID and hash in low-count immediate values][#9096] |
| 79 | +- #9102 [Add a fast path for hashing numerics and immediates][#9102] |
| 80 | +- #9113 [Performance regression in RubyHash for large hashes (~8-10x slower than JRuby 1.7)][#9113] |
| 81 | +- #9119 [Implement fast-path builtin method flags][#9119] |
| 82 | +- #9123 [Fast builtin validation experiment][#9123] |
| 83 | +- #9124 [Reduce load factor for Hash from 5 to 2][#9124] |
| 84 | +- #9136 [Marshal.load 2.9x regression vs JRuby 1.7][#9136] |
| 85 | +- #9143 [Cache both hash forms for FString][#9143] |
| 86 | +- #9148 [Allow logical ops to begin on beginning of next line][#9148] |
| 87 | +- #9154 [Mask internal Ruby backtrace elements like native masking][#9154] |
| 88 | +- #9156 [Small marshal fixes][#9156] |
| 89 | +- #9174 [Add complete thread-local builtin tracking system (Issues #9116, #9119)][#9174] |
| 90 | +- #9180 [Implement implicit param logic for Binding][#9180] |
| 91 | +- #9181 [Fix Data subclasses with ivars][#9181] |
| 92 | +- #9202 [A Data object should be frozen even if it has no members][#9202] |
| 93 | +- #9209 [Add ruby_bug for spec of Data with no members being frozen][#9209] |
| 94 | +- #9210 [Remove Process::Status#& and Process::Status#>>][#9210] |
| 95 | +- #9233 [Load boot scripts from classloader URI][#9233] |
| 96 | +- #9235 [Use capitalized Class and Module for frozen errors][#9235] |
| 97 | +- #9236 [Properly handle keywords in {Kernel|Thread|Fiber}#raise][#9236] |
| 98 | +- #9238 [Cloned class's singleton class has too many classes in hierarchy][#9238] |
| 99 | +- #9239 [Fix for cloned class singleton class has too many ancestors][#9239] |
| 100 | +- #9250 [Update Unicode to Version 17.0.0 and Emoji Version 17.0][#9250] |
| 101 | +- #9262 [Abstract RubyHash][#9262] |
| 102 | +- #9263 [Implicit param fixes for proc and binding][#9263] |
| 103 | +- #9266 [Endless method with modifier method does not parse][#9266] |
| 104 | +- #9273 [Cleanup recursion guards][#9273] |
| 105 | +- #9277 [Use live counts for event hook stats][#9277] |
| 106 | +- #9279 [Move fiddle back to default temporarily for resolv][#9279] |
| 107 | +- #9286 [Proposing RISC-V architecture support][#9286] |
| 108 | +- #9287 [Add riscv64 platform support][#9287] |
| 109 | +- #9298 [Ensure we have a classloader to boot from][#9298] |
| 110 | +- #9299 [Delete methods deprecated prior to JRuby 9.4.0.0][#9299] |
| 111 | +- #9300 [Replace now-deprecated wait_timeout][#9300] |
| 112 | +- #9313 [Time being returned as ASCII-8BIT encoding in JRuby 10][#9313] |
| 113 | +- #9318 [`Process.detach` raises ArrayIndexOutOfBoundsException if called from a thread that is not the main thread][#9318] |
| 114 | +- #9325 [[fix] NullPointerException from closed IO][#9325] |
| 115 | +- #9362 [Allow endless methods to be an argument to methods like visibity][#9362] |
| 116 | +- #9365 [Marshal load perf][#9365] |
| 117 | +- #9371 [Deprecate all public RubyString constructors][#9371] |
| 118 | +- #9374 [Integrate WASM-based Prism parser into standard build][#9374] |
| 119 | +- #9383 [Disable IntFixnum][#9383] |
| 120 | +- #9384 [Set.new(a_set) throws LocalJumpError][#9384] |
| 121 | +- #9385 [Fixes #9384. Set.new(a_set) throws LocalJumpError][#9385] |
| 122 | + |
| 123 | +[#8716]:https://github.com/jruby/jruby/pull/8716 |
| 124 | +[#8747]:https://github.com/jruby/jruby/issues/8747 |
| 125 | +[#9055]:https://github.com/jruby/jruby/pull/9055 |
| 126 | +[#9066]:https://github.com/jruby/jruby/pull/9066 |
| 127 | +[#9069]:https://github.com/jruby/jruby/pull/9069 |
| 128 | +[#9074]:https://github.com/jruby/jruby/pull/9074 |
| 129 | +[#9075]:https://github.com/jruby/jruby/pull/9075 |
| 130 | +[#9077]:https://github.com/jruby/jruby/pull/9077 |
| 131 | +[#9078]:https://github.com/jruby/jruby/pull/9078 |
| 132 | +[#9079]:https://github.com/jruby/jruby/pull/9079 |
| 133 | +[#9083]:https://github.com/jruby/jruby/pull/9083 |
| 134 | +[#9085]:https://github.com/jruby/jruby/pull/9085 |
| 135 | +[#9090]:https://github.com/jruby/jruby/issues/9090 |
| 136 | +[#9091]:https://github.com/jruby/jruby/pull/9091 |
| 137 | +[#9095]:https://github.com/jruby/jruby/pull/9095 |
| 138 | +[#9096]:https://github.com/jruby/jruby/issues/9096 |
| 139 | +[#9102]:https://github.com/jruby/jruby/pull/9102 |
| 140 | +[#9113]:https://github.com/jruby/jruby/issues/9113 |
| 141 | +[#9119]:https://github.com/jruby/jruby/issues/9119 |
| 142 | +[#9123]:https://github.com/jruby/jruby/pull/9123 |
| 143 | +[#9124]:https://github.com/jruby/jruby/pull/9124 |
| 144 | +[#9136]:https://github.com/jruby/jruby/issues/9136 |
| 145 | +[#9143]:https://github.com/jruby/jruby/pull/9143 |
| 146 | +[#9148]:https://github.com/jruby/jruby/pull/9148 |
| 147 | +[#9154]:https://github.com/jruby/jruby/pull/9154 |
| 148 | +[#9156]:https://github.com/jruby/jruby/pull/9156 |
| 149 | +[#9174]:https://github.com/jruby/jruby/pull/9174 |
| 150 | +[#9180]:https://github.com/jruby/jruby/pull/9180 |
| 151 | +[#9181]:https://github.com/jruby/jruby/pull/9181 |
| 152 | +[#9202]:https://github.com/jruby/jruby/pull/9202 |
| 153 | +[#9209]:https://github.com/jruby/jruby/pull/9209 |
| 154 | +[#9210]:https://github.com/jruby/jruby/pull/9210 |
| 155 | +[#9233]:https://github.com/jruby/jruby/pull/9233 |
| 156 | +[#9235]:https://github.com/jruby/jruby/pull/9235 |
| 157 | +[#9236]:https://github.com/jruby/jruby/pull/9236 |
| 158 | +[#9238]:https://github.com/jruby/jruby/issues/9238 |
| 159 | +[#9239]:https://github.com/jruby/jruby/pull/9239 |
| 160 | +[#9250]:https://github.com/jruby/jruby/issues/9250 |
| 161 | +[#9262]:https://github.com/jruby/jruby/pull/9262 |
| 162 | +[#9263]:https://github.com/jruby/jruby/pull/9263 |
| 163 | +[#9266]:https://github.com/jruby/jruby/issues/9266 |
| 164 | +[#9273]:https://github.com/jruby/jruby/pull/9273 |
| 165 | +[#9277]:https://github.com/jruby/jruby/pull/9277 |
| 166 | +[#9279]:https://github.com/jruby/jruby/pull/9279 |
| 167 | +[#9286]:https://github.com/jruby/jruby/issues/9286 |
| 168 | +[#9287]:https://github.com/jruby/jruby/pull/9287 |
| 169 | +[#9298]:https://github.com/jruby/jruby/pull/9298 |
| 170 | +[#9299]:https://github.com/jruby/jruby/pull/9299 |
| 171 | +[#9300]:https://github.com/jruby/jruby/pull/9300 |
| 172 | +[#9313]:https://github.com/jruby/jruby/issues/9313 |
| 173 | +[#9318]:https://github.com/jruby/jruby/issues/9318 |
| 174 | +[#9325]:https://github.com/jruby/jruby/pull/9325 |
| 175 | +[#9362]:https://github.com/jruby/jruby/pull/9362 |
| 176 | +[#9365]:https://github.com/jruby/jruby/pull/9365 |
| 177 | +[#9371]:https://github.com/jruby/jruby/pull/9371 |
| 178 | +[#9374]:https://github.com/jruby/jruby/pull/9374 |
| 179 | +[#9383]:https://github.com/jruby/jruby/pull/9383 |
| 180 | +[#9384]:https://github.com/jruby/jruby/issues/9384 |
| 181 | +[#9385]:https://github.com/jruby/jruby/pull/9385 |
0 commit comments