4 ms·
> Why isn't shipping the runtime with the code a more common practise? That's what I actually do for our product. The JRE is shipped with it as well as startup
by p2detar 2y ago
> Why isn't shipping the runtime with the code a more common practise?
That's what I actually do for our product. The JRE is shipped with it as well as startup scripts and services registration bridge for Windows.
I guess the native compile thing is more for "Java on the Cloud" which tbh is not where Java shines. I say this as a long-term Java developer. Java is great for monoliths - on premises customers are supper happy. Java on the cloud seems like a waste of resources to me.
- xxs 2y agoWhile not a fan of the cloud - in case of java; package it in docker or whatever deployables along with the JRE (or even JDK) and call it a day. Compile to native makes sense only for very fast startup cases. As for wasted resources - there are cases where the servers have to be deployed in specific jurisdictions (compliance) - it's easier to use AWS than manage tons of small sites. Still I don't see any need for native compilation.
- sgammon 2y ago> Compile to native makes sense only for very fast startup cases. It also makes sense to reduce container size and vulnerability surface, and to reduce warmup time to peak JIT performance. > Still I don't see any need for native compilation. Sure, there isn't a "need," per se, just like there is not a "need" for JIT. This is how technology evolves. Things get better. Java's startup and time-to-peak performance are now comparable to native langs.
- xxs 2y ago>and to reduce warmup time to peak JIT performance. This actually works in the opposite way - JIT is a guided compilation which uses the input for best results. There are many optimizations done for multi call sites, e.g. static linking + guard, dual site inline, inline caches, and the v-table calls if all fails. Without guided optimization such decisions are not likely to happen. In other words for peak runtime performance JIT would surpass ahead of time/native compilation. >reduce container size I would be exceptionally hard pressed to find a single case where that would matter (aside specific client deployments) - server side and the like I'd not care about extra 100MB or so deployable. E.g. if I want really small footprint I'd go and do it all in pure C w/ an absolute min external library support. >startup times I already mentioned it - and anything not sub 0.5sec, Java does quite ok. There is a lot to be said about the use of DI frameworks with blatant class path scans, but that's not necessarily Java's fault.
- p2detar 2y ago> There is a lot to be said about the use of DI frameworks with blatant class path scans, but that's not necessarily Java's fault. I used to support Atlassian's products on the intranet before we migrated (almost) everything on their cloud: Jira, Bitbucket, Bamboo, Confluence. I think Jira and Bitbucket were hands down the slowest of the bunch to boot and from what I could tell it was exactly due to classpath-scanning and god knows what else. I could never believe a 16 CPU 32 GB KVM needs from 3 to sometimes 5 minutes just to boot Jira. To me this was insane.
- sgammon 2y agoPeak runtime performance is slightly better on JVM, yes. Native Image ships a JIT within your binary so it is not as different as one might think.
- chii 2y agomy understanding is that native compile isn't shipping a jit, but is running the jitted code that was produced during compilation. However, if your code is so "dynamic" (aka, has lots of deeply nested inheritance) that it slows down procedure calls from so many levels of indirection, then a JVM runtime will jit a better version of native code when running using runtime information (such as jump directly to the correct virtual function instead of indirection). The compiled version do not have access to this runtime information, so you can't get this sort of optimization. However, for "simple" code (like arithmetic, or manipulation of bits, arrays etc), i think it's pretty much the same.
- sgammon 2y ago> Why isn't shipping the runtime with the code a more common practise? It really shouldn't be. It bloats everything. Containers are bigger. Software is bigger. There's no reason to do this, since very few apps use the entire surface area of a runtime (Python, Node, Java, etc). Instead, a native GraalVM binary can embed all these things, including only the portions which the application needs to run. Thus it behaves like a dynamic piece of software during development, but a static, high-performance, low-surface-area-of-vulnerability native binary in production. > That's what I actually do for our product. The JRE is shipped with it as well as startup scripts Please, as a user, I implore you to look into native targets. It's not as hard as it seems anymore. Some thins really do need Jlink. > I guess the native compile thing is more for "Java on the Cloud" Not so. GraalVM is great for embedded development. It's great for desktop development or even shared native library development. > Java on the cloud seems like a waste of resources to me. There is no difference now between C++ "in the cloud" and Java "in the cloud" except Java remains memory safe by default.
- p2detar 2y ago> Please, as a user, I implore you to look into native targets. It's not as hard as it seems anymore. Some thins really do need Jlink. You are not my target. It's enterprise software - I'm given a Windows Server VM and the rights to install our software, that's it. Most IT admins don't even want to bother to install or let alone support JRE updates. We got tons of customers and this experience is uniform. > It's great for desktop development For desktop I'd totally use Jlink. Really the only possible place GraalVM's NI seems like a plausible fit to me is CLI tools and Java Microservices, where fast start and low memory consumption actually make sense. edit: But honestly at this point for Microservices I'd probably go with Go.