6 comments

  • steve_barham 4 minutes ago
    I did something similar a few years back, with a slightly different approach to declaration, using interfaces to denote the layout of the struct. Mutation was opt-in by exposing setters using the (of the time) standard JavaBeans layout and an annotation processor took care of the codegen of an implementing class, which could be used where you wanted an on-heap box of an off-heap structure.

    One benefit of this approach was that by using the interface as the type you could fairly easily support a flyweight pattern, reducing GC pressure when working with large off-heap collections. The parallels between stateless interfaces and offheap structs was also quite pleasing.

    I'd love to see a similar effort using more modern techniques than Unsafe et al.

  • matt_heimer 17 minutes ago
    What is the positioning for this and how does it work? A comparison to SBE might be nice.

    I understand the issue about using Layout and MemorySegment being verbose but the reason I'm using those things it to develop high performance software that uses off-help memory and bypasses object allocation.

    What does "map Java record types onto native memory" actually mean? Did you somehow turn a Java record into a flyweight or is `Point point = points.get(0);` just instantiating a record instance using data read from off-help memory? If it's a dynamic mapping library using reflection, that's cool but doesn't it kill the performance goals for most Java off heap usage?

    Is this more of a off-heap to heap bridge for pulling data into the normal Java space when performance isn't critical?

    • joe_mwangi 7 minutes ago
      I use c-struct layout. I should be more explicit in the readme. I use classfile api to generate bytecode during initialisation of the Mem<T> and bytecode stored in cache in case if initialised again somewhere based on the same record type (I don't cache for records that are declared locally in a method). The class created from implementing Mem is a hidden class. So, basically, given a record, one can be able to analyse the layout based on record state description, and then for that Mem implementation (hidden class) we generate static final field varhandles + layout, segment is an instance field, and then generate bytecode the get and set to avoid reflection (actually, this is where most headache is in implementation). Go to the test package and see simple code for some adhoc rudimentary java (and native) files for benchmarks. Planning to test JMH benchmarks soon.
  • wood_spirit 1 hour ago
    This is interesting. Java desperately needs an array of struct for type safe sugar over high performance arenas, but the areas you’d turn to this would be in a zero allocation effort where the cost of the this library’s off-heap and the object allocation in the getters and setters etc largely negate the advantages for a lot of use cases.
    • joe_mwangi 56 minutes ago
      Yup. Totally agree. Java does needs an array of structs. Hopefully value classes will help out through flattened array. But in future, one can use value records with this library with probable zero cost allocation. But the library doesn't use any reflection calls for get and set hence high performance as a result, and using records helps a lot with escape analysis. Planning to do some serious benchmarks soon. Some preliminary tests shows it's similar to c code (example code in test package). Performance suffers if record fields are arrays due to heap allocation of arrays.
      • PaulHoule 21 minutes ago
        The thing I coded where I felt the weight of the GC the most was a chess engine in Java that needed transposition tables. Like using regular HashMap(s) or anything similar it was too slow to really speed up the engine. If my son had stayed interested in chess I would have coded up an off-heap transposition tables but he switched to guitar which changed my side projects.
        • joe_mwangi 1 minute ago
          Hope you come back. Would be cool to venture in this new data oriented programming phase java has invested a lot in.
      • fweimer 16 minutes ago
        I doubt value classes will be helpful here because the array would have to be immutable. Context: https://openjdk.org/jeps/401
  • jayd16 14 minutes ago
    At first glance it reminds me of C#'s Span<T>.
    • joe_mwangi 2 minutes ago
      Hahaha... inspired by it actually.
  • usernametaken29 31 minutes ago
    Why not use graal?
  • kosolam 1 hour ago
    Nice. Very clean api.
    • joe_mwangi 53 minutes ago
      Thanks. Main goal. Unions is where I decided to pause - no simple and ergonomic way to do it at the moment.