[HN Gopher] Finding Java Thread Leaks with JDK Flight Recorder a...
       ___________________________________________________________________
        
       Finding Java Thread Leaks with JDK Flight Recorder and a Bit of SQL
        
       Author : gunnarmorling
       Score  : 135 points
       Date   : 2023-03-04 13:57 UTC (9 hours ago)
        
 (HTM) web link (www.morling.dev)
 (TXT) w3m dump (www.morling.dev)
        
       | sgt wrote:
       | For a split second there, I thought a post-airline accident
       | flight recorder had some Java heap dumps that showed major issues
       | and thread leaks.
        
       | marginalia_nu wrote:
       | Say what you will about Java, but its tooling is not lacking.
        
         | nih0 wrote:
         | i miss the tooling so much, theres not many programming
         | languages that can compete, maybe c# with the jetbrains suite
        
           | pjmlp wrote:
           | .NET with Visual Studio Enterprise. There is enough of .NET
           | that Rider still doesn't do.
        
             | whoisthemachine wrote:
             | Any examples? The only one I've encountered in the last few
             | years is editing .net core WinForms UIs with the visual
             | editor. In every other use case of mine, Rider has
             | outclassed Visual Studio.
        
               | pjmlp wrote:
               | WPF, Blend, hot code reloading, repl, mixed language
               | debugging with C++/CLI, C++/CX, C++/WinRT, SharePoint,
               | Dynamics, SQL Server SP, Architecture tooling, coverage
               | and automatic unit tests, COM interop tooling, Azure
               | workloads integrations, some of the examples that come to
               | my mind.
               | 
               | Also, when already paid for MSDN license which includes
               | VS, why pay for Rider?
        
               | whoisthemachine wrote:
               | Rider has a great WPF editor (again, I would say it often
               | surpasses VS in terms of code completion), and is capable
               | of hot code reloading (for server code - it doesn't work
               | with WPF AFAIK).
               | 
               | I'm also not sure what you mean by "REPL" as I tend to
               | think of that as a language feature, not an IDE feature
               | (most read-eval-print-loops are done through a terminal,
               | which Rider has).
               | 
               | Rider also has coverage and automatic unit tests (and
               | it's sibling product Resharper had it for years before
               | Visual Studio added it).
               | 
               | "Architecture tooling" could be a quite broad category,
               | but as far as where I've used Jetbrains products in this
               | sense, they can automatically build class diagrams and
               | the like from your code, and even export them to PlantUML
               | if you want.
               | 
               | Jetbrains also offers an IDE that can handle C++ just
               | fine - https://www.jetbrains.com/clion/. I don't know how
               | well it handles WinRT, but I'll admit I've never had the
               | need to develop or deploy a WinRT application. I do know
               | that they've started building in MAUI integration [2].
               | 
               | I'll confess I don't use Dynamics, or know what SQL
               | Server SP is, but Rider has great Database tooling built
               | in. I've never had a problem connecting to MS SQL Server,
               | SQLite, Postgres, or MySQL databases with it.
               | 
               | > Also, when already paid for MSDN license which includes
               | VS, why pay for Rider?
               | 
               | I guess this question is aggressively asking why someone
               | would choose Rider if they already have Visual Studio
               | Enterprise, and beyond it's great tooling, the main
               | benefits for me are the great code completion, the
               | snappiness of the UI (you can use the editor before it
               | has loaded the AST), and how rare crashes are with it
               | (and it has seemingly gotten even rarer in the last few
               | months, I can't remember it crashing). Beyond that, if
               | you have to choose between the two, an Enterprise MSDN
               | license is $6k/yr [0], and a commercial Rider license +
               | the other Jetbrains C# tools is $470/yr [1]. The former
               | is usually a difficult question with your manager and/or
               | purchasing, while the latter hardly raises an eyebrow.
               | 
               | [0] https://www.microsoft.com/en-us/d/visual-studio-
               | enterprise-s...
               | 
               | [1] https://www.jetbrains.com/rider/buy/#commercial
               | 
               | [2] https://blog.jetbrains.com/dotnet/2022/08/02/rider-20
               | 22-2-re...
        
               | pjmlp wrote:
               | Instead of VS, buy two IDEs on top of MSDN, great.
               | 
               | SQL Server Stored Procedures, which can be written in
               | .NET, as SQL Server hosts the CLR. This includes the
               | whole debugging and deployment stuff.
               | 
               | Architecture tooling means Enterprise Architect level not
               | basic PlantUML stuff.
               | 
               | MSDN licenses are always part of Windows development
               | workshops, the only question is choosing between
               | professional or enterprise.
               | 
               | So anything JetBrains is always extra.
        
               | easton wrote:
               | > The former is usually a difficult question with your
               | manager and/or purchasing, while the latter hardly raises
               | an eyebrow.
               | 
               | The one thing is that everyone on your team probably uses
               | Visual Studio or has a license if you're a .NET shop,
               | that may not be true of Rider or ReSharper. Your manager
               | is already convinced of the need for VS. (I just bought
               | my own JetBrains Toolbox because I had a coupon, but my
               | company will pay for ReSharper if we want it)
        
               | yakubin wrote:
               | I don't know about .NET, but REPLs don't need to have
               | anything to do with terminals. One example of a REPL are
               | Swift Playgrounds in XCode. Jupyter Notebooks are also a
               | kind of REPL.
        
               | whoisthemachine wrote:
               | Certainly, and there are numerous REPL environments (LINQ
               | Pad springs to mind), including via the console.
        
               | rvdginste wrote:
               | > paid for MSDN license
               | 
               | I believe a lot of companies are not directly paying for
               | MSDN licenses, but retrieve them for free through a
               | Microsoft partnership and by fulfilling conditions to
               | obtain silver and gold competencies. I think this is the
               | case for a lot of smaller companies.
               | 
               | Microsoft however is changing their partnership
               | conditions by focusing more and more on Azure. To be able
               | to stay a partner with similar benefits, you basically
               | need to generate more and more revenue on Azure for
               | Microsoft. Something that will not be doable for a lot of
               | smaller companies in my opinion. And this also depends a
               | lot on the focus of the company, whether it is a pure
               | software development shop or also a reseller of Azure
               | services.
               | 
               | Besides that, .net development is no longer necessarily
               | windows development. My current team consists of 6
               | people. 1 uses Linux, 2 use OS X, 3 use Windows. We use
               | Rider, Webstorm and Datagrip. We develop .net backends
               | that run on a Linux app service plan. The front end is in
               | Angular. The database is postgresql.
               | 
               | A lot of the .net developers in our company asked to use
               | Rider instead of the VS they get through an MSDN license.
               | Most of them are Windows users. Some people clearly think
               | Rider is superior to VS, myself included...
        
         | cbm-vic-20 wrote:
         | One thing I love about the JVM is that the tooling can be used
         | in production if necessary- generating thread dumps, JFR
         | recordings, monitoring heap usage, etc., all of this is
         | invaluable when diagnosing problems.
        
           | marginalia_nu wrote:
           | Yeah, if needs must, you can even attach a remote debugger to
           | a process i prod. Pretty crazy.
        
         | [deleted]
        
       | TYMorningCoffee wrote:
       | > and the stack trace of the parent thread when starting the
       | child thread
       | 
       | That's incredibly useful. We have a strict policy of all threads
       | and pools being named, but sometimes default named threads sneak
       | in making it difficult to figure out where the thread is used
       | for.
        
       | Scarbutt wrote:
       | HN being very anti Java, why does such many Java articles make it
       | to the front page?
        
         | ncann wrote:
         | That's not my experience at all, if anything I feel like HN is
         | quite fond of Java. The anti Java crowd is mostly on Reddit
         | instead where it's the subject of memes and jokes and the like.
        
           | lenkite wrote:
           | Except /r/java where Java is God
        
         | exabrial wrote:
         | A lot of it is misdirected hate.
         | 
         | In the first dot.com boom, a lot of people worked for tech
         | companies, and Microsoft was the Google|Apple back then. Their
         | corporate culture was dog-eat-dog nonsense, but it trickled
         | down through the industry... and of course at the time Java was
         | super super popular, even though _it really sucked_ back then
         | (not so much now, it's quite awesome).
         | 
         | One of the most _hated_ positions was "The Architect" who
         | usually rose to the top via floating on top of a bubble of
         | attrition; so rather than being promoted because you're good at
         | leadership or a great person that's fun to be around or a
         | technically savvy and loved to teach... these architects were
         | ignorant egotistical maniacal dictators that got promoted
         | merely because everyone else quit. They turned static analysis
         | tools into weapons of war. They made arbitrary standards that
         | really didn't work for anyone, rather than trying to work for
         | someone. Everything had to be over-engineered (sound familiar?
         | If not, look at today's SPAs) with
         | AbstractFactoryProducerMethodProducerImplInterfaces. I worked
         | at a lot of these companies, and it just wasn't a fun time to
         | be in software development.
         | 
         | Rather than people seeing the reality that Poor Leadership and
         | zero charisma as the root cause, somehow people arrived at Java
         | was the core problem.
         | 
         | A lot of the things were good in their intention; for instance,
         | having the whole company use tabs instead of spaces (or vice
         | versa) and having a universal code formatter have the potential
         | to increase communication. But instead, it was just executed
         | poorly at nearly every shop and the vast majority of the
         | problems got turned into Dilbert comics.
         | 
         | But yeah, Java.
        
         | mqus wrote:
         | Maybe the commenters are "anti" and the voters aren't (more
         | comments being also a detriment to getting to the frontpage)?
         | 
         | But I don't see any real "anti" comments, only valid criticism
         | and I say that as a Java dev myself. It does have its wrinkles.
         | But for it's age and popularity it's still a pretty good
         | language.
        
       | pron wrote:
       | JFR is one of my favourite Java features. Like eBPF but with more
       | events baked into the runtime and easier to use.
       | 
       | Gunnar has used it in some cool ways. Not just
       | https://github.com/moditect/jfr-analytics, which he showcases in
       | this post, but also https://github.com/moditect/jfrunit
        
         | gunnarmorling wrote:
         | JFR is just awesome. Thanks a lot for the nice words, Ron!
         | Means a lot to me, coming from you.
        
         | pjmlp wrote:
         | And if my history recollection is right, originally born on
         | J/Rockit JVM.
        
           | pron wrote:
           | Correct.
        
       | exabrial wrote:
       | I need to learn to use jfr apparently. Just something I've known
       | existed and never used.
       | 
       | We attach a hawtio.io jvm agent to every single prod jvm we run
       | and query the agent using telegraph. (If you don't do this by the
       | way, you should!) I noticed in the GUI portion of hawtio, it
       | slows you to start/stop a jfr recording, but I've never messed
       | with it
        
       | nomemory wrote:
       | Java is not the most appealing programming language, but you've
       | got to love the JVM, the standard library, all the libraries and
       | frameworks, plus the tooling around the ecosystem.
        
         | smallerfish wrote:
         | Hence, Kotlin.
        
           | kaba0 wrote:
           | Or Scala, Groovy, Clojure, Ceylon.. we have heard it a few
           | times already.
        
             | [deleted]
        
           | pjmlp wrote:
           | So when are we getting Kotlin Virtual Machine, designed for
           | Kotlin?
        
             | MattPalmer1086 wrote:
             | Does the JVM impose heavy constraints on Kotlin?
             | 
             | I ask because the JVM is an amazing bit of technology that
             | has been battle tested for decades. Would be hard to beat I
             | would think.
        
               | vips7L wrote:
               | One of the major issues that Kotlin faces is that it's
               | hard for them to change the VM to provide a feature they
               | want while Java and the OpenJDK developers have the
               | freedom to either change the VM or the language to
               | provide something.
        
               | MattPalmer1086 wrote:
               | Sounds like Kotlin and other JVM languages need greater
               | representation in OpenJDK then, if that would be
               | possible.
        
               | tadfisher wrote:
               | I don't think it's too burdensome, because they can
               | emulate features until the JVM gets support. I can think
               | of several:
               | 
               | - Data classes can become JVM records with the @JvmRecord
               | annotation and some additional type constraints.
               | 
               | - Inline classes will certainly become Valhalla value
               | types (hence the required @JvmInline annotation).
               | 
               | - Nullable types are supported with compile-time checks
               | and additional runtime checks inserted by the compiler at
               | time-of-use, and if Valhalla adds a nullability marker to
               | the bytecode, Kotlin can support it.
               | 
               | - Coroutines/structured-concurrency already uses
               | Executors under the hood, so it's likely that we'll have
               | Loom thread support without any changes to the coroutines
               | APIs (though the standard dispatchers will need to use
               | virtual threads themselves). Coroutines themselves are
               | CPS-transforms of ordinary code and don't need VM
               | support.
               | 
               | - Tail-call elimination is supported by transforming to
               | trampolines, something which the JVM will probably never
               | support until Java needs it.
        
               | vips7L wrote:
               | Right but, in my opinion, those all come with ergonomic
               | issues from not being able to change the VM. In general
               | the quality of the feature provided by Java will be
               | better because of their ability to mold the VM to the
               | language.
               | 
               | For example syntactic cooperative coroutines vs
               | preemptive coroutines provided by the VM. Kotlin is now
               | stuck with the colored function problem and has the stack
               | trace issues that the Java team is able to avoid by not
               | only being able to change the language.
               | 
               | That being said, I think they're both fine languages with
               | different goals.
        
           | derriz wrote:
           | I've a couple of years of experience of using Kotlin. In many
           | ways I loved it, and it would have become my JVM language of
           | choice but over time I've started feeling uncomfortable about
           | recommending it.
           | 
           | The language is completely closed and controlled by a single
           | commercial software company and there is no community process
           | involved in its evolution and design. I had believed that
           | this business model of programming language design/ownership
           | died decades ago when everyone abandoned all the bespoke
           | commercial languages/IDEs of the 1980s and early 1990s. The
           | way Jetbrains have scuppered the attempt to provide a
           | reasonable vscode plugin feels like reliving the 1990s where
           | the single company providing the language spec, compilers,
           | IDE and tooling for "their" language and aggressively
           | prevented others from providing alternative tools and
           | compilers.
           | 
           | Also compile times are horrendous - even with modern
           | hardware, the compiler barely seems to be able to manage much
           | more than a few 1000 lines/sec. Again, my age means I
           | remember decades ago when compilers/IDEs advertised their
           | performance in terms of 100,000s of lines per second. This
           | means edit/compile/debug workflow is very painful once your
           | project grows to non-toy sizes.
           | 
           | I also grew to dislike the ethos of the "community" which
           | basically seemed to involve condescension and passive
           | aggressive responses to to any questions regarding the design
           | of language features particularly by Jetbrains employees.
           | 
           | Kotlin is undoubtably a more "modern" feeling of development
           | than Java (or C++ for example) but I'm not sure such vendor
           | lock-in is worth it given many other languages are catching
           | up (including Java) or exceed it. Also I used C# for about a
           | year subsequently and realised that Kotlin stole most of its
           | best features from C#. Languages like Rust, Zig, Swift, etc.
           | are just as "modern".
        
         | thangalin wrote:
         | Here's a real-world example of using C# to create a set of file
         | paths, aiming to eliminate duplicates. I'd've written this in
         | Java as:                   Set<File> s = new HashSet<File>();
         | s.add( new File( "c:/temp" ) );         s.add( new File(
         | "c:/temp" ) );              System.out.println( s.size() );
         | 
         | This prints 1.
         | 
         | The C# code:                   ISet<FileInfo> s = new
         | HashSet<FileInfo>();              s.Add( new FileInfo(
         | "c:/temp" ) );         s.Add( new FileInfo( "c:/temp" ) );
         | Console.WriteLine( s.Count );
         | 
         | This prints 2.
         | 
         | They are line-for-line identical. IMO, Java prints the correct
         | result. C# may have reasons for this behaviour, but when you're
         | looking at the code, it's not obvious that two FileInfo objects
         | for the same paths are not equal.
         | 
         | When I wrote KeenWrite[0], I chose Java because of all the
         | reasons you mentioned, plus JavaFX. JavaFX is one of the
         | richest cross-platform GUI libraries available for desktop
         | applications, although it does have quirks.
         | 
         | [0]: https://github.com/DaveJarvis/keenwrite
        
           | mrkeen wrote:
           | I aimed to eliminate duplicates of URLs using that approach
           | in Java. Do they resolve to the same IP? Same URL.
        
             | electrum wrote:
             | Yeah, URL is from the first release of Java and should be
             | avoided. You want to use URI instead.
        
       ___________________________________________________________________
       (page generated 2023-03-04 23:00 UTC)