I've been diving into the mechanics of Java and how it handles method arguments, especially when it comes to value types like records. I understand that Java always passes variables by value, but I'm curious about whether value types are copied each time they're passed to a method. When we talk about performance, copying large value objects can get costly. Is there any technical insight into this, especially considering the introduction of value types through the Valhalla project?
1 Answer
Once value types come through Valhalla, the JVM can optimize how they’re handled. It won't always copy the actual value for every operation; instead, it can rearrange things under the hood. This allows the JVM to do some heavy optimization because there are no identity semantics involved. For specific cases, it may treat these like regular heap objects initially, but it can also optimize them effectively, especially if they are used in computations frequently.

Totally agree! The aim here is efficiency. If the JVM identifies that a value type can be inlined or managed in registers, it will do that automatically, so complications with copying don’t need to bog down the performance.