[HN Gopher] GC progress from JDK 8 to JDK 17
       ___________________________________________________________________
        
       GC progress from JDK 8 to JDK 17
        
       Author : carimura
       Score  : 246 points
       Date   : 2021-11-24 14:12 UTC (8 hours ago)
        
 (HTM) web link (kstefanj.github.io)
 (TXT) w3m dump (kstefanj.github.io)
        
       | seanwilson wrote:
       | How much do you need to worry about the GC causing frame
       | stuttering when writing games now? Object pools are still
       | important?
        
         | zokier wrote:
         | Well, jdk17 was released just few months ago so I doubt anyone
         | has real experience with it for gamedev. But considering that
         | game heaps are relatively small (as in <100G) and modern Java
         | GCs can manage consistent <1ms pause times, I'd imagine Java is
         | more viable for gamedev from that point of view. I'd also
         | emphasize that there is large spectrum of performance
         | requirements for games and you can make quite a lot these days
         | with relatively poor performance characteristics, and on the
         | other hand in the top end Java probably is still not good
         | enough.
        
           | adgjlsfhk1 wrote:
           | IMO java for gamedev is pretty much un-viable due to the lack
           | of control over memory layout. You clearly can make it work
           | (see Minecraft), but it just sounds painful, and there isn't
           | a clear benefit.
        
             | 5e92cb50239222b wrote:
             | Minecraft wouldn't be anywhere near where it is today if it
             | was not written in Java (which made modding much easier
             | compared to native code, and made heavy modding possible).
             | So there is a strong benefit, it's just not very obvious.
        
               | Thaxll wrote:
               | Minecraft performance is a joke in 2021, when you see how
               | much CPU you need to get 10 players in a world.
               | 
               | It is written in Java because the original devs probably
               | did not know anything better.
        
               | kaba0 wrote:
               | It uses that much CPU because the original devs did not
               | know how to program well and it allocates a shitton of
               | objects. It is not a good example of a well-written java
               | game.
        
             | billfruit wrote:
             | Why is controls over memmory layout important for Games?
             | 
             | If you work on Android games for example would you get any
             | kind of control over mem layout, irrespective of the stack
             | you will be using?
        
               | adgjlsfhk1 wrote:
               | For a simple example if you make a simple type to store
               | the color of a pixel
               | 
               | class RGB { float r float g float b ... }
               | 
               | and then make an `ArrayList<RGB>` the list will end up
               | using over 2x the memory (128 bytes for object headers,
               | 64 bytes for pointers in the list) compared to a language
               | with value types. What makes this even worse is that
               | since you are using a list of pointers, you can't use
               | SIMD for any of your computations, and accessing elements
               | will be slow since the values won't be in cache.
        
               | kaba0 wrote:
               | Just to add, the really performance oriented hot loops
               | can be rewritten with Class-of-Arrays with three int
               | arrays for r, g and b values, or even a single one with
               | flattened ints, with a user-friendly wrapper RGB class
               | provided for outside use. With good OOP-usage it would
               | not even be ugly. Performant java code has been written
               | like that for decades, and these will get really close to
               | C-programs.
               | 
               | Also, there is now a Vector API that let's you use SIMD
               | operations with configurable lane width (and a safe
               | fallback to for loops for processors without the
               | necessary instructions)
        
               | throwaway34241 wrote:
               | To add to adgjlsfhk1's answer, if you are writing Android
               | games you are probably using a cross-platform game engine
               | that doesn't use Java (like Unity) which solves the issue
               | but more importantly also allows you to sell your game on
               | iOS without a re-write.
        
               | kllrnohj wrote:
               | Look up "data oriented design" GDC talks or "AoS and SoA"
               | for more in depth information to your question. The very
               | brief tldr is that if you want to go fast, you have to
               | design for cache locality and memory access patterns.
               | 
               | In particular for Java there's regularly dependent
               | pointer loads, which are dreadfully slow on modern CPUs
               | and also waste a significant amount of L1/L2 cache.
        
               | kaba0 wrote:
               | While not the most ergonomic, one can definitely create
               | SoAs in Java and those will be just as fast as they are
               | in low level languages.
        
             | kaba0 wrote:
             | There are many types of games. For 2D games Java is more
             | than performant enough, without question.
             | 
             | Java can be ridiculously fast when only primitives are used
             | so I wouldn't put a quite performant game engine past it,
             | but yeah, it would perhaps not be my first choice for a new
             | AAA game engine.
        
             | 6gvONxR4sf7o wrote:
             | What kind of games do you need to worry about memory layout
             | for? From the outside, I'd expect that it's as diverse as
             | most software, where sometimes you need control like C and
             | other times python will do.
        
               | actuallyalys wrote:
               | > From the outside, I'd expect that it's as diverse as
               | most software, where sometimes you need control like C
               | and other times python will do.
               | 
               | I develop games as a hobby, and my understanding is that
               | this is literally true, but a little misleading. Games
               | are as diverse as other areas of software, but they're
               | skewed toward the more complex and demanding end. I don't
               | think it's that atypical for a moderately complex game by
               | an indie studio to get to the point where memory layout
               | is a concern, which I don't think is as true for web
               | apps, desktop apps, or other areas of development. That
               | being said, I think worrying about memory layout is more
               | than a lot of games need.
        
             | shawnz wrote:
             | C# has a similar memory model and it's the primary language
             | used by Unity games... would you say that's un-viable?
        
               | throwaway34241 wrote:
               | For memory layout C# actually has an important difference
               | in that it supports value types (so you can have an array
               | of vertices without individually allocating each one,
               | which has a lot of overhead and drastically reduces cache
               | efficiency). They've been working on adding support for
               | that to Java for some time but it's not in yet.
        
               | kllrnohj wrote:
               | The game engine is different from the game logic. This
               | may mean Java is more viable for game logic, but still
               | not viable for the engine itself
               | 
               | That said, C# has value types and has for years now.
               | Which is hugely important for arrays, and a major, major
               | missing piece to the Java performance puzzle. C#'s FFI is
               | also way better than the disaster that is JNI, which also
               | plays a role here.
        
               | kaba0 wrote:
               | You are right, but I would like to add that both of these
               | concerns will be solved in the near-far future. Java's
               | project Panama tries to tackle the less than ideal FFI
               | case with a tool that can create java classes from a C
               | header and an API for manually managing memory regions.
               | 
               | While Valhalla is in the works, but it is, I quote, at
               | least 3 PhD's worth of knowledge combined to figure it
               | out in a backwards compatible way with all the
               | interactions of generics, etc.
        
       | gregaccount wrote:
       | Looking at that, why isn't ZGC the standard GC in Java 17?
        
         | jbellis wrote:
         | One of the graphs shows ZGC with almost 50% more overhead (in
         | heap space) than G1, which could very well take some
         | applications from "works fine" to "broken." So I can see why
         | they'd leave it something to opt in to.
        
         | __s wrote:
         | Only stabilized in Java 15
        
         | kaba0 wrote:
         | Latency and throughput are fundamentally opposite ends of the
         | same axis. And perhaps the majority of Java applications prefer
         | better throughput.
        
           | twic wrote:
           | But the graph in the article shows that ZGC now gets _better_
           | throughput than G1! [EDIT no it doesn 't]
           | 
           | I suspect the answer is that ZGC is not considered mature
           | enough, and has a higher memory overhead than G1.
        
             | dralley wrote:
             | There are also other GCs that are heavily competitive with
             | ZGC, such as Shenandoah. It might make sense to see how
             | they all pan out before choosing a new default.
        
               | Sindisil wrote:
               | Shenandoah isn't an Oracle maintained feature, so they'll
               | never allow it to become the OpenJDK default (though
               | another vendor make it so in their distribution).
        
             | cpitman wrote:
             | No, that graph may be hard to understand. It shows the
             | _relative_ improvement each GC has made since Java 8, not
             | the absolute performance.
        
               | twic wrote:
               | Ah, i realised it was relative, but i had assumed they
               | were all relative to the same baseline! Should have been
               | obvious from the way the bars are all level for JDK 8,
               | really. That seems a needlessly unhelpful graph.
        
               | kevincox wrote:
               | They are essentially 3 graphs displayed together. It
               | probably would have make sense to present them more
               | separately.
        
             | kevincox wrote:
             | The article does not compare the throughput of different
             | GCs other than different improvements. The baseline for the
             | G1 graph is JDK8 G1 performance and the baseline for the
             | ZGC graph is JDK11 ZGC performance. There is really nothing
             | that can be directly compared between the two.
        
         | vips7L wrote:
         | G1 is probably still a better choice as it "balances throughput
         | and latency". ZGC also wasn't generational until recently.
        
           | hashmash wrote:
           | I see that generational ZGC is under development, but have
           | you been able to try it out? I don't see any EA releases for
           | it.
        
             | vips7L wrote:
             | I have not tried it. I just saw the commits (it was 5
             | months ago), so I had assumed it was merged.
        
         | Rovanion wrote:
         | Absolute gc throughput and overhead.
        
       | thomascgalvin wrote:
       | Those latency and pause-time numbers are pretty sexy. 200ms is
       | still probably too high for some applications, but for everything
       | I work on, this is incredible.
        
         | hedora wrote:
         | Those are P99 latencies. Not sure how they measure, but my
         | assumption is that, if you probe the JVM at a random point in
         | time, ZGC (P99 = 0.1) will be unresponsive for 100us 1% of the
         | time.
         | 
         | That's... not incompatible with being useable in a low latency
         | service, but 100us is 2.5 x longer than a sync disk write these
         | days, and they don't report max latency.
         | 
         | My take on the article is that GC has gotten quantifiably
         | better since Java 8, but not qualitatively better:
         | 
         | The types of projects that had to abandon Java due to GC (and
         | JIT) latency 10 (or 20) years ago still shouldn't consider
         | using Java.
        
           | kaba0 wrote:
           | I'm by no means an expert but even the OS's scheduler can
           | cause pauses on the range of 1ms -- so the applications that
           | can't use Java, cannot really use ordinary OSs to begin with,
           | can they?
           | 
           | Like, yeah, I would probably not write something like
           | pipewire (linux's new audio processing project) in Java, but
           | other than that and like some really low latency trading
           | niche (where FPGAs are dominant now as even general CPUs are
           | slow), where would it preclude the usage of Java?
        
             | adgjlsfhk1 wrote:
             | The Linux kernel has realtime and lowlatency versions that
             | help a lot here.
        
       | pjmlp wrote:
       | Note, only relevant for OpenJDK and the JVMs based on it, there
       | are other GC available to other JVMs, including real time ones.
        
         | pkoperek wrote:
         | Genuinely interested - could you share some good resources
         | about it?
        
           | Thaxll wrote:
           | https://www.azul.com/
        
             | vips7L wrote:
             | OpenJ9 as well: https://www.eclipse.org/openj9/
        
               | ece wrote:
               | Some more info on OpenJ9 GCs here:
               | https://developer.ibm.com/articles/garbage-collection-
               | tradeo...
        
           | pjmlp wrote:
           | For example, in what concerns real time GCs, these are good
           | books,
           | 
           | "Hard Realtime Garbage Collection in Modern Object Oriented
           | Programming Languages."
           | 
           | https://www.amazon.com/Realtime-Collection-Oriented-
           | Programm...
           | 
           | The author is one of the founders of Aicas real time JVM,
           | https://www.aicas.com/wp/products-services/jamaicavm/
           | 
           | "Distributed, Embedded and Real-time Java Systems"
           | 
           | https://link.springer.com/book/10.1007/978-1-4419-8158-5
           | 
           | PTC is the other company alongside Aicas, that still sells
           | real time Java systems,
           | https://www.ptc.com/en/products/developer-tools/perc
           | 
           | IBM J9 has the evolution of the Metronome GC, https://www.res
           | earchgate.net/publication/220829995_The_Metro...
           | 
           | And it has extensions for value types, via packed object
           | data, https://www.ibm.com/docs/en/sdk-java-
           | technology/7.1?topic=ob...
           | 
           | Someone else already referred Azul, they also have extensions
           | for value types, called object layouts,
           | https://www.slideshare.net/AzulSystems/jvm-language-
           | summit-o...
           | 
           | Then there are special flavours like microEJ or the Android
           | Java snowflake.
        
         | tannhaeuser wrote:
         | graalvm and graalvm's svm/native-image as well, the latter
         | having only SerialGC, with G1 in EE only, and crashing ;(
        
       | bob1029 wrote:
       | As a .NET developer I am a little envious of all the GC knobs
       | that Java developers get to play with.
       | 
       | If I could have only 1 new GC thing from Microsoft, it would be
       | the ability to totally disable GC during the lifetime of a
       | process. I don't even want to be able to turn it back on.
       | 
       | I have a lot of scenarios where I could get away with the cruise
       | missile approach to garbage collection. No reason to keep things
       | tidy if the whole world is gonna get vaporized after whatever
       | activity completes. Why waste cycles cleaning things up when you
       | could be providing less jitter to your users or otherwise
       | processing more things per unit time?
        
       | zokier wrote:
       | Shenandoah GC is conspicuously missing despite having similar
       | availability to ZGC and competitive performance characteristics.
        
         | maxpert wrote:
         | I've used Shenandoah GC with great success and I recommend
         | anyone considering ZGC (specially on Kube and container
         | environments) to try Shenandoah first. You won't have to do
         | additional work to enable large pages, yet your performance is
         | pretty close.
        
         | papercrane wrote:
         | It would be good to see the numbers, but I suspect the reason
         | is just that the author used the Oracle build of OpenJDK which
         | doesn't include it.
        
       | twic wrote:
       | Shame this doesn't show the CMS collector, which was present in 8
       | and 11, but removed before 17. CMS was the go-to option for low-
       | latency collection for a long time, so it would be good to see
       | how it compares to the modern options.
       | 
       | It would be particularly interesting from the perspective of
       | someone working in a shop which still has lots of latency-
       | sensitive-ish workloads running on JDK 8 with CMS!
        
         | jbellis wrote:
         | Here is the comparison I did with Cassandra workloads,
         | comparing CMS with ZGC: https://jaxenter.com/apache-cassandra-
         | java-174575.html.
         | 
         | (TLDR, ZGC is a huge improvement.)
        
         | lmilcin wrote:
         | Also, it would be interesting to see this progression from at
         | least 1.4. By the time 1.8 was released I had the impression
         | that GC is already pretty well optimized for throughput.
        
           | twic wrote:
           | Although if your ulterior motive is to persuade people to
           | upgrade beyond 8 and 11, you probably don't want to suggest
           | that performance has basically plateaued.
        
             | lmilcin wrote:
             | I don't see how this is bad.
             | 
             | JVM is pretty well optimized and it is much closer to raw C
             | performance than most other popular languages. You could
             | also say that C is bad because its performance plateaued a
             | long time ago.
        
               | jonhohle wrote:
               | C maps more closely to assembly/hardware than most other
               | languages. Saying C has plateaued gets pretty close to
               | saying it's hardware performance that's plateaued.
        
               | SubjectToChange wrote:
               | If C mapped to "hardware" so well then OpenCL, CUDA
               | C/C++, SYCL, ispc, etc wouldn't be necessary. The rising
               | importance of accelerators is a big issue for the future
               | of C.
        
               | Jensson wrote:
               | Those languages maps to GPU's, C maps to CPU's. Those are
               | on the same level as C, they aren't the real instructions
               | that GPU's run but they are a pretty good abstraction for
               | GPU instructions.
        
               | SubjectToChange wrote:
               | ispc is explicitly designed to take advantage of SIMD on
               | CPUs and GPUs, its existence is directly related to the
               | shortcomings of C in this area. Likewise, SYCL exists to
               | target accelerators because C isn't even close to
               | supporting heterogeneous hardware or programming. In any
               | case, C does not map well to a massive amount of hardware
               | running in production right now.
        
               | Jensson wrote:
               | A CPU can run any program written for a GPU, yes. But the
               | languages you talk about are no closer to how a CPU work
               | than C is, they might be more ergonomic if you want to
               | take advantage of SIMD instructions but they don't do
               | anything you can't do in C and there are a lot of things
               | you can't do in them since GPU's are much more limited
               | than CPU's.
        
               | kaba0 wrote:
               | C doesn't map any more closely to assembly/hardware than
               | most other low level languages. If anything, hardware
               | tries to conform as much to C programmers as they can.
               | 
               | Hell, now Java has much better SIMD support than C, even
               | as a high level language.
        
               | Jensson wrote:
               | Not sure what you mean, SIMD instructions maps perfectly
               | well to C. You just call them like you call any other
               | thing. What C doesn't do well are the exact CPU memory
               | load order, how it caches things in the CPU etc. But no
               | language can do that as you can't even control that in
               | the machine code sent to the CPU. But most things you can
               | do in machine code can also be done in C, and then things
               | you can't can be done in inline assembly.
        
               | gunnarmorling wrote:
               | I suppose what they referred to is Java's (currently
               | incubating) vector computation API. It lets you express
               | vectorized algorithms in high-level way, with the API's
               | methods being translated of the corresponding SIMD
               | instructions of the underlying platform. I.e. you'll get
               | vectorized execution on x86 and AArch-64 in a portable
               | way, including transparent fallback to scalar execution
               | if specific operations aren't supported on a specific
               | target platform.
        
               | Jensson wrote:
               | Right, but that would still mean that C is closer to the
               | hardware than Java. Java has a high level but less
               | powerful solution, since you can only use it on vectors
               | and not arbitrary data anywhere. You can write a similar
               | function in C which compiles differently depending on
               | where you compile and falls back in the same way, just
               | that C gives you the option to use the hardware dependent
               | instructions anywhere if you want.
        
               | kaba0 wrote:
               | I'm not sure I understand you: in C there is no standard
               | way for SIMD afaik. There are pragmas on for loops, or
               | other compiler specific tools but the language itself
               | don't have any notion of lanes or SIMD instructions.
        
               | Jensson wrote:
               | > but the language itself don't have any notion of lanes
               | or SIMD instructions.
               | 
               | C doesn't need it, you can just call CPU instructions
               | like functions. SIMD is just another kind of CPU
               | instruction, so C supports it. That works in C since you
               | have a direct view of the memory layout. It doesn't work
               | in higher level languages where memory is abstracted away
               | from you, in those you need the higher level concepts you
               | are talking about in order to take advantage of SIMD.
        
               | gunnarmorling wrote:
               | These instructions are ISA specific though; i.e. in C
               | you'd have to implement your solution once using x86 SIMD
               | instructions and once using the AArch64 counterparts.
               | You'd also have to account for different vector lengths.
               | Whereas the Java API does all that for you automatically,
               | e.g. automatically taking advantage of longer vectors
               | when running on AVX512, and shorter ones elsewhere.
               | 
               | I think that's what people consider "better" about the
               | Java approach (at least I do). That's of course not to
               | say that you cannot do all this in C as well, but I think
               | having these capabilities in that portable way available
               | in Java makes SIMD useable for a huge audience for the
               | first time which didn't consider that a realistic option
               | before.
        
       | ozim wrote:
       | Which does not matter because most of stuff still rides Java 8.
        
         | JanecekPetr wrote:
         | ...and they're missing out, that's exactly the message. By the
         | way, I'd be shocked if Java 8 was still more than half of the
         | running server-side JVMs. There's a lot of them for sure, but
         | I'd be willing to bet it's gonna be less than a half now, and
         | declining.
        
         | guenthert wrote:
         | They continue to use Java 8 as they see to reason to change.
         | Article like this are meant to motivate those laggards.
        
       | Thaxll wrote:
       | What is not shown is those benchmark is how much CPU is used for
       | each GC. For example the latency for ZGC is much lower but does
       | it means it uses more CPU than G1.
        
         | [deleted]
        
       | kaba0 wrote:
       | Just sharing this really great benchmark series on JVM GCs,
       | though it doesn't include the latest versions of OpenJDK:
       | 
       | https://jet-start.sh/blog/2020/06/23/jdk-gc-benchmarks-remat...
        
       | jimsimmons wrote:
       | These GCs have a 1GB overhead when working with a 16GB heap.
       | That's 6% of your available memory. I was expecting modern GCs to
       | be way more efficient so I'm kinda shocked this is what state of
       | the art is.
       | 
       | I also wonder how much of the progress to "Sub (200) millisecond"
       | latency target is due us just having faster machines. I honestly
       | have no model to tie this to actual performance of my code. I
       | guess it translates but not really sure how.
       | 
       | Not bagging on Java ---- I am just surprised how inefficient an
       | industrial strength GC can be. I understand why manual memory
       | management still holds its own now.
        
         | dehrmann wrote:
         | It's worth noting glibc isn't zero-overhead, either.
        
         | naasking wrote:
         | > These GCs have a 1GB overhead when working with a 16GB heap.
         | That's 6% of your available memory.
         | 
         | 6% memory overhead while preserving throughput is actually
         | quite excellent. Just a little more than the average
         | fragmentation overhead under manual memory management.
         | 
         | Manual memory management can "hold its own" because it can
         | tailor the allocation/release profile to the problem and
         | aggregate some of those overheads.
        
         | cowsandmilk wrote:
         | > due us just having faster machines
         | 
         | ?? These benchmarks keep the machine constant. And I'm not sure
         | we've seen faster machines in a long time. Clock speeds have
         | remained fairly constant and gains are solely in more cores.
        
         | kaba0 wrote:
         | Seeing that RAM is the cheapest resource to scale (and that
         | cleverly using it saves energy, given that Java uses the least
         | energy out of managed languages) it seems to be a very good
         | tradeoff.
        
           | kllrnohj wrote:
           | Accessing RAM is very slow and CPU caches don't scale,
           | though. So it's not as simple as you're presenting it
        
             | kaba0 wrote:
             | Well, for general computing I don't think we have an answer
             | either way. Yeah, for some hot loop with an array we get
             | insane performance, but that is a very specific workload
             | and not applicable everywhere. What about a chat
             | application, which parts of the memory should be physically
             | close to each other?
             | 
             | Also, Java's GCs are compacting, putting similarly old
             | objects relatively close to each other. The same random
             | chat program in C might use a linked list with worse
             | characteristics so it is really not that obvious to me what
             | would be a good solution.
        
         | foldr wrote:
         | Manual memory management can also have overhead due to e.g.
         | fragmentation. I don't know if it approaches 6% in realistic
         | scenarios.
        
           | pkolaczk wrote:
           | Wait, fragmentation is not included in that 6%. It is that a
           | GC with no fragmentation will already suffer a 6% overhead. A
           | region-based GC will suffer from additional temporary
           | fragmentation on top of those 6% as well, because some
           | segments can be filled only partially with live objects until
           | they are compacted. That effect might be actually bigger
           | because allocations are done only from contiguous space, and
           | it can't just try to allocate from the "holes" until it
           | compacts them. And you also need some additional room to do
           | allocations from in order to avoid too frequent GCs. So I'm
           | practice it is not 6% but sometimes 600%.
        
             | foldr wrote:
             | Yes, sure. But you do still need to compare the total
             | overhead associated with manual memory management (which is
             | not zero) to the total overhead associated with GC. It's an
             | empirical question which is larger in any given case. And
             | of course it depends on the implementation of malloc and
             | the implementation of GC.
             | 
             | I'm not expressing a view as to whether the overheads of
             | manual memory management are typically comparable or not. I
             | really don't know.
        
               | pkolaczk wrote:
               | The total memory overhead of manual memory management can
               | be virtually zero if you're careful enough to avoid
               | fragmentation (and you can because it is manual, so you
               | control a lot of details). There is for example no
               | constant header for each allocated chunk. In Java you pay
               | additional 16B for each allocated object and you can't
               | get away from that overhead.
        
               | foldr wrote:
               | Yes, manual memory management can always be better with
               | arbitrary amounts of tuning. However, I think the more
               | interesting question is how the overheads compare in
               | typical applications written in a reasonably
               | straightforward and maintainable style. In practice,
               | fragmentation can be a difficult problem to avoid when
               | using manual memory management. For example, Firefox
               | struggled with it for a long time.
        
               | pkolaczk wrote:
               | A web browser is a huge and complex app. The argument it
               | struggled with memory issues is moot if you can't show a
               | comparably featured app written in Java to compare memory
               | use.
               | 
               | Anyways, I've got plenty of anecdotal evidence where Java
               | apps take order of magnitude more memory than their close
               | counterparts written in languages that use manual memory
               | management. Not browsers, but things like benchmarking
               | tools, webservers or even duplicate file finders
               | (shameless plug:
               | https://github.com/pkolaczk/fclones#benchmarks - there is
               | one Java app there, see its memory use :D)
        
               | foldr wrote:
               | We're talking at cross purposes here. I did say that I
               | wasn't expressing a view as to whether the overheads of
               | manual memory management are typically larger than the
               | overheads of GC. I don't know if they are or not.
               | 
               | The point I was making was just that you do need to
               | compare empirically the typical overheads of each to make
               | a meaningful comparison. The 6% figure in isolation
               | doesn't tell us very much.
               | 
               | As you point out, it is difficult to make these
               | comparisons on the basis of anything other than anecdotal
               | evidence, since it is rare for applications of
               | significant size or complexity to be implemented in
               | multiple languages.
        
           | atom3 wrote:
           | According to the cppcon talk about Mesh [1] (an allocator
           | that implement compaction for C++ programs), the overhead can
           | be massive too (17% overhead measured on firefox, 50% on
           | redis!)
           | 
           | [1] https://youtu.be/XRAP3lBivYM?t=1374
        
             | jimsimmons wrote:
             | Nice link. I guess theoretically you can always optimise
             | this in languages with manual management. With complex GC
             | you have to figure out a way to tame the beast and I'm not
             | sure if it's easier to reason about
        
         | pron wrote:
         | Sub-millisecond is already here with ZGC, and it's not much to
         | do with faster machines (machines haven't become that much
         | faster over the past ten years) but with more sophisticated
         | algorithms.
        
       | dandotway wrote:
       | As Java is generally the fastest GC'd language, what's the
       | current state of Java gamedev?
       | 
       | Once upon a time, this indie Java game called Minecraft became
       | the most successful game of all time.
       | 
       | But from the few minutes of research I just did, Java cannot be
       | deployed to many commercially important systems                 -
       | Nintendo Switch       - PlayStation       - iOS
       | 
       | It appears Java is only still viable for Windows and Android, and
       | the 1% Linux desktop market.
       | 
       | There used to be the GCJ project which would in theory let you
       | run Java anywhere you had a C/C++ compiler, but Oracle's
       | litigiousness killed that because the Java[TM] "platform" must
       | run the official Java[TM] bytecode.
       | 
       | It appears C# via Monogame lets you deploy to all desktops
       | (Win/Mac/Linux), mobiles (iOS/Android), and consoles
       | (PS/Switch/Xbox). So ironically C# seems to now be the "write
       | once, run anywhere" fulfillment of the original Java promise.
       | 
       | [EDIT: grammar.]
        
         | admax88qqq wrote:
         | Seriously, with sub-ms pause times of ZGC you could run a GC
         | every frame and have tons of time to space for actual
         | processing.
        
           | dandotway wrote:
           | It sounds very nice but if more than half an indie game's
           | revenue comes from Nintendo Switch then you need a low
           | friction way to get your .java files running there. You also
           | need a proven audio mixer stack so you can load
           | background_music.mp3 and play bang.wav and boom.wav without
           | any popping or leaks. Right now Java seems sort of iffy on
           | consoles, as in, you could maybe spend a ton of time and/or
           | money to get an effort like GraalVM production-grade working
           | there, but no one has bothered to do it yet. It seems to be
           | much lower friction to just use C#/MonoGame, or SDL2 with
           | your scripting language of choice that compiles with a C/C++
           | compiler, or a proven game engine.
        
         | JanecekPetr wrote:
         | For native binaries, we now have
         | https://www.graalvm.org/reference-manual/native-image/, but it
         | probably doesn't yet work nicely with game frameworks? Not
         | sure.
         | 
         | There are some engines, frameworks: https://jmonkeyengine.org/,
         | https://litiengine.com/, https://libgdx.com/,
         | https://www.lwjgl.org/.
         | 
         | But I have no real experience with any of those.
        
         | pjmlp wrote:
         | You can on iOS, for example with Codename One or Gluon Mobile,
         | 
         | https://www.codenameone.com
         | 
         | https://gluonhq.com/products/mobile/
         | 
         | They are also quite happy to sponsor possible console ports.
        
         | aetherspawn wrote:
         | Is Java GC ("the best") really that much better than something
         | with immutable heap ie Haskell?
        
           | dandotway wrote:
           | I love functional languages but is anyone actually using
           | Haskell to develop for Nintendo Switch and PlayStation? Can
           | you use Haskell on the Nintendo Switch to access a robust
           | audio mixer stack?
           | 
           | F# can be used with C#/MonoGame which seems to run well
           | everywhere so that's one route to functional programming
           | gamedev. Another route appears to be to use SDL2 with a
           | functional language that supports ANSI C bytecode runtime
           | fallback. E.g. OCaml has a bytecode compiler and an ocamlrun
           | runtime that can be compiled with an ANSI C compiler. But I
           | don't know what the GC latency guarantees are for the
           | bytecode runtime. OCaml's native low latency GC benefits from
           | Jane Street's contributions because Jane Street uses OCaml
           | for high frequency trading. But bytecode OCaml running on
           | Nintendo Switch isn't the same thing as native Linux OCaml.
        
         | kllrnohj wrote:
         | Java's FFI and value type situation are the two major missing
         | pieces for Java gamedev. C# has better stories for both, and
         | has from the beginning.
         | 
         | Don't confuse Java having the fastest GC with Java being the
         | fastest GC'd language (especially not in all situations)
        
           | kaba0 wrote:
           | Java's new better FFI is almost ready with project Panama and
           | value types will come, but it is exceedingly hard to retrofit
           | into a language (but the idea for the exact semantics might
           | have formed already!)
        
           | cesarb wrote:
           | > Don't confuse Java having the fastest GC with Java being
           | the fastest GC'd language
           | 
           | I've always wondered, it's likely that Java has the fastest
           | GC because it _needs_ to have the fastest GC, otherwise it
           | would be a bottleneck. Other popular languages probably don
           | 't depend as much on the performance of their memory
           | allocation primitives.
        
         | winrid wrote:
         | You can compile to iOS/Android with libgdx.
         | 
         | I've been doing this with a game I'm building that has a custom
         | 3D OSM map renderer.
        
       | mcdonje wrote:
       | The throughput & latency charts have JDK8 pegged at 100%. Since
       | that's meaningless and the value is in the difference between the
       | JDK versions, it should be represented as a delta.
        
       | vletal wrote:
       | I like how this reached the top page soon after "Go does not need
       | a Java-style GC" (https://news.ycombinator.com/item?id=29319160).
       | 
       | Moreover, are the significantly lower GC pause times help improve
       | snappiness of GUI apps, such as IntelliJ IDEA?
        
         | fnord123 wrote:
         | Current IntelliJ uses Java11 and has gotten slower over the
         | past few years (anecdata from my own use) - so probably not.
        
           | hiram112 wrote:
           | This is what I've noticed too. Intellij has never exactly
           | been speedy, but it had so many great features that it was
           | worth it compared to other slow IDEs like Eclipse. And using
           | a basic text editor like VIM or even VS Code with a big Java
           | project isn't really feasible like it might be in other
           | languages like Python or Node.
           | 
           | However, now it is really bogging down. I'm sure it doesn't
           | help that I've got several IDEs open along with some
           | monstrosity of a "microservice" framework running half a
           | dozen docker services and DBs on an older Macbook Pro, but
           | it's true that app and OS devs tend to use all increases in
           | CPU and ram, and so absolute performance and battery life
           | never seems to get better over the years, regardless of how
           | much the underlying hardware itself has improved.
        
             | vips7L wrote:
             | VS Code is fine with with big projects, I've been using it
             | for 2 years. The language server is Eclipse after all.
        
               | pjmlp wrote:
               | Red-Hat is behind most of the Java plugins, so their
               | quality is quite good, there is only the pain to live
               | with Electron.
        
           | thies wrote:
           | Since 2020.x it's definitely slower. The addition of
           | jetbrains space doesn't seem to help either and removing the
           | plugin itself makes the whole ide unstable
        
             | vips7L wrote:
             | I wish they would just release a light version, without all
             | the database, spring integration, and other crap. I just
             | want a light language server.
        
               | matsemann wrote:
               | Just deactivate the plugins?
        
               | 5e92cb50239222b wrote:
               | Try power saving mode (look in ctrl+shift+a).
        
               | absove wrote:
               | wouldn't community edition fit the bill? Those things you
               | mention are the main difference with ultimate.
        
               | vips7L wrote:
               | Not sure. I moved to VS Code + Eclipse LS and it's such a
               | more pleasurable experience. However, it doesn't support
               | SBT which is the build tool my company uses.
        
           | aenis wrote:
           | Not just slower, also energy hugry. My m1 max running pycharm
           | loses about 10pct of charge an hour on their crappy bundled
           | jvm, and around 4% on the latest java17-based ones, but does
           | act weird at times when using them. Its probably down to
           | metal vs opengl. Disappointing.
        
         | pjmlp wrote:
         | The GC might help, but it doesn't do magic when threads aren't
         | used the correct way, too much stuff lands on the UI thread or
         | synchronous IO is used all over the place.
        
         | [deleted]
        
         | edgyquant wrote:
         | That's the magic of HN (or maybe it's a form of the Baader-
         | Meinhof Phenomenon.) When one topic reaches the front page it
         | seems like a couple more based around it hit the front page the
         | same or next day, which allows us to expand on what we've
         | learned.
        
         | Erlangen wrote:
         | Intellij uses UseConcMarkSweepGC gc, which has been deprecated
         | since Java 9. Jetbrains is still investigating the use of ZGC.
         | https://youtrack.jetbrains.com/issue/IDEA-247824
        
           | darksaints wrote:
           | Honestly this is the most frustrating thing about Jetbrains.
           | Stop investigating shit and just use the new JVMs already.
           | There is no excuse for using deprecated JVMs.
        
             | lmilcin wrote:
             | I am pretty sure Jetbrains cares their product works well
             | for a lot of people and they know better than you which JVM
             | is better for their product.
             | 
             | It is not like it restricts what you can build with it.
             | 
             | We may not know their exact decision process but it is
             | incredibly ignorant to assume they are just doing this out
             | of laziness or incompetence.
        
               | darksaints wrote:
               | They've already explained their reasoning, I don't have
               | to assume anything. Their reasoning is bad:
               | 
               | * They've fixed long-known bugs in the JVM
               | 
               | * They've added sub-pixel anti-aliasing and other visual
               | rendering enhancements.
               | 
               | Both of these are clear improvements on the JVM, and very
               | likely to be accepted upstream, but instead of
               | upstreaming them, they decided to create a long-running
               | fork and package it as their own runtime. And like all
               | long-running forks, they're struggling to keep up.
               | 
               | So we are left with two choices: abandon the hope of a
               | functional IDE that only works well on a customized
               | runtime, or abandon the litany of performance,
               | capability, security, and stability improvements in the
               | JVM standard and reference JVM implementation.
        
               | astange wrote:
               | This is so removed from reality that it's difficult to
               | know where to start.
               | 
               | For starters, sub-pixel aliasing is a standard part of
               | the JDK and isn't a Jetbrains addition.
               | 
               | What exactly is stopping you from using a standard JDK17
               | build with Intellij? How is the IDE not functional for
               | you when doing so? How is it improved when using the
               | JDK17 runtime they have on their github page?
        
               | darksaints wrote:
               | This is easy:
               | 
               | Standard Jetbrains Runtime - slow as fuck, missing a
               | whole host of performance improvements, security updates,
               | and bug fixes since the fork occurred back in JDK8/9 Era.
               | 
               | OpenJDK - ugly as sin, gui becomes glitchy, lose out on
               | customer support channels (first thing they tell you is
               | to use the standard jetbrains runtime)
               | 
               | Newer versions of Jetbrains Runtime - have to reinstall
               | manually every time you update your IDEs. You also lose
               | out on customer support, as they are beta software.
               | 
               | This isn't really a hard problem to solve: find a way to
               | upstream your improvements to the JVM, and then package
               | the upstreamed version. All of these problems go away,
               | and you're even relieved of the burden of maintain a long
               | running fork.
        
               | astange wrote:
               | Yes, this is easy:
               | 
               | - The current JBR is JDK11, not JDK8. - You don't need to
               | reinstall anything to use an alternative JDK with the
               | IDE. Just set the IDEA_JDK envar to the JDK of choice. -
               | Ugly as sin is an opinion. I use the IDE with linux on a
               | hidpi display. Looks perfectly acceptable to me...even
               | running with JDK18. - I just reported an issue while
               | running with the JBR17 a few days ago. Jetbrains was
               | perfectly responsive to my issue.
        
               | lmilcin wrote:
               | But what is _your_ problem with this? Do you _really_
               | care which JVM is being packaged or you are just picking
               | on something that isn 't a problem?
               | 
               | Have you had a problem running IntelliJ IDEA?
               | 
               | I am pretty sure that if I was distributing a very, very
               | complex Java application for a very, very wide variety of
               | audience (like people who aren't even developers because
               | IDEA also caters to these people) I would distribute it
               | with JVM packaged.
               | 
               | And then the user should not care which JVM exactly is
               | being distributed. You only need to care about the end
               | result.
               | 
               | Let me know the last time you cared which version of JVM
               | is used by any of the SAS products you subscribe to.
        
               | darksaints wrote:
               | Yes, I care. Because while jetbrains makes an excellent
               | IDE in terms of functionality, they have extremely shitty
               | startup times and garbage collection pauses. These are
               | both areas that have received a lot of attention in the
               | reference JVM in the versions subsequent to their fork.
               | All of the performance problems literally disappear by
               | using a newer OpenJDK version, but then the GUI starts to
               | look and act weird.
               | 
               | I don't know why you would assume that I am asking for
               | them to not package a JDK at all. That's a fucking absurd
               | assumption, and nothing i have said has even suggested
               | that. All I'm asking for is for them to upstream their
               | improvements and package their IDEs with OpenJDK by
               | default so we don't have to choose between Jetbrains
               | improvements or OpenJDK improvements.
        
             | melony wrote:
             | I don't understand why they are not shipping their own
             | bespoke GC to go with Intellij, Jetbrains is already
             | building their own JVMs.
        
             | astange wrote:
             | Edit the idea64.vmoptions config file and use the GC of
             | your choice. I've been running with ShenandoahGC for quite
             | some time now and it's been working great.
             | 
             | Also, see https://github.com/JetBrains/JetBrainsRuntime/rel
             | eases/tag/j... for a JDK17 runtime for Intellij products.
             | I've been running this too and it works great (but does
             | require some tweaks to the vmoptions file).
        
               | vips7L wrote:
               | I tried this last year but the version they shipped with
               | IDEA didn't have ZGC and using an external JVM caused
               | some weirdness in the GUI for me.
        
               | parhamn wrote:
               | Curious before I try it, is the speed/performance any
               | better?
        
               | astange wrote:
               | It depends. There is less latency in the IDE due
               | primarily to better GC (just as the article describes). I
               | think the speed is better too on things like indexing the
               | code base, but that could depend on your computer. I'm
               | running on a 32core high end AMD system with lots of RAM,
               | and I increase the heap setting in Intellij to 4G, etc. I
               | think the IDE is subjectively better.
               | 
               | We run all our production applications on JDK17 too,
               | which is why I push to run everything on 17.
        
               | 5e92cb50239222b wrote:
               | Text can look pretty bad if you're using other JVMs
               | without their patches.
        
               | hawk_ wrote:
               | Yes particularly on Linux, any non jetbrains jdk running
               | intellij looks awful. I don't know if the consider it as
               | some kind of competitive advantage to not submit fixes
               | upstream.
        
               | The_rationalist wrote:
               | A part of their patches (at least for emojis?) got
               | recently merged
        
               | belter wrote:
               | What are they doing in the JVM to make text look good?
        
             | pjmlp wrote:
             | They are in bed with Google, so they need to spend their
             | resources improving Kotlin use cases instead.
        
           | Ind007 wrote:
           | It is defaulted to G1 now(I have 2021.2.2 version).
        
             | Erlangen wrote:
             | I am running 2021.2.3 now. `ps aux | grep GC` still shows
             | "-XX:+UseConcMarkSweepGC"
        
               | stusmall wrote:
               | -XX:+UseG1GC on my install of clion. Maybe old JVM
               | parameters have persisted in settings somewhere?
        
               | cesarb wrote:
               | > Maybe old JVM parameters have persisted in settings
               | somewhere?
               | 
               | This is an annoying behavior on at least Intellij Idea (I
               | don't know about other Intellij products). If you ever
               | increased its memory limit (it's an option on one of the
               | top-level menus, and it will also occasionally suggest
               | increasing it if it ever notices it's using too much
               | memory), it copies the idea64.vmoptions file which
               | contains not only the memory limit (-Xmx), but all the
               | JVM parameters, from the binary directory to your
               | configuration directory, and so the JVM parameters on it
               | will be kept forever, instead of being changed when you
               | update the IDE. The fix is easy: find that copied
               | idea64.vmoptions file, write down the memory limit on it,
               | remove that file, restart the IDE, and go to that top-
               | level menu option to set the limit again. This will copy
               | an updated set of VM options to your configuration
               | directory.
        
               | finalfantasia wrote:
               | They changed the default garbage collector to G1 last
               | year.[1]
               | 
               | [1] https://github.com/JetBrains/intellij-
               | community/commit/edf1c...
        
         | [deleted]
        
         | Sankozi wrote:
         | Snappiness problems are often due to lazy loading Java classes.
         | 
         | For example first time loading project settings takes 1+
         | seconds while next less than 0.5. This value might get lower
         | later if JVM decides to optimize more some parts of UI
         | application.
        
           | fnord123 wrote:
           | I don't think that's where the issues are. IntelliJ freezes
           | when reindexing a project when you change branches from the
           | command line.
        
         | msie wrote:
         | I've given up on IntelliJ and java-based UI's long ago. So
         | disappointing.
        
           | coliveira wrote:
           | That's the right way to go. Like IntelliJ or not, Java is a
           | legacy technology. I wouldn't want to depend on that.
        
             | kaba0 wrote:
             | Lol, you are laughably bad to think that java is legacy.
             | 
             | The JVM is improving with never before seen speed, has
             | state of the art GCs, a very good JIT compiler, upcoming
             | green threads that will make blocking code automagically
             | unblocking and once Valhalla hits with value types, there
             | really will be very few areas where java would not be
             | applicable.
             | 
             | And on top of that, there is also Graal, which is a novel
             | way to run and optimize mixed-language code bases.
        
       ___________________________________________________________________
       (page generated 2021-11-24 23:00 UTC)