Multi-tenant Java 8 VM in beta
ibm.com
ibm.com
Links to notes on this, https://plus.google.com/113218107235105855584/posts/K9seVudj... . Stack overflow q, http://stackoverflow.com/questions/4692076/speed-up-applicat...
CDS is fantastically un-isolated and using it is going to be systemwide. You're still running many many java copies, and that is fat in size, ugly and busted in form. Containers like Tomcat exist to solve a near-like problem of being a many-application serving system. This virtualized virtual machine is definitely the first runtime that's oriented to multi-tenant, but if you look around, you can find some it's technical roots here and there.
IBM's multi-tenancy gives 3.3 speedup, for HelloWorld - worse for others (maybe if they combined it with CDS?)
BTW: The only way to get instant Java startup is not to startup - use an already running JVM, with the classes already loaded. It's fast. Just leave it in the background til you need it - it's effectively a server. Especially good to invoke javac this way, for lightening compiles (if like me you don't use an IDE).
Additionally, the Drip project [2] uses a swapping strategy, by keeping an additional JVM spun up in the background. It was apparently built because the authors had trouble with persistent JVMs containing old dependencies.
An unexpected benefit (unexpected to me, anyway) was that not only do you avoid the startup penalty, but you also benefit from JIT compilation of javac itself - every time it compiles, it gets faster! IIRC it's fairly substantial the first 10 times, but still improving at 50.
Here's a working minimal starting point I just put together for you (check docs, google, stackoverflow etc):
import javax.tools.*;
import java.io.*;
class Demo {
public static void main(String args[]) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, System.out, System.out, args);
}
}
java Demo Foo.java # compiles Foo.java
Here's a stackoverflow answer suggesting something similar http://stackoverflow.com/a/793913/50979BTW: I called out to a bash script to work out which source files had changed, because it's easier than writing that bit in java (and this compiler doesn't do that for you - it just compiles the explicitly listed source files).
HTH - let me know if you need more info. I've been thinking of using Jnotify to watch for source files being written to, so it's 100% automatic - one issue is that I save quite often, and each will trigger a compile (I'm doing this with plain javac and inotify at the moment).
I also had hoped it would allow e.g. a constantly running fat server to run eclipse for multiple users more efficiently than each desktop duplicating work.
http://lukas.zapletalovi.com/2012/11/want-faster-java-startu...
I had thought CDS was just for Sun and IBM implementations, but from the above I can infer it works on OpenJDK too.
When you say, 'running many many java copies', do you mean java.exe?
"You can run several application domains in a single process with the same level of isolation that would exist in separate processes, but without incurring the additional overhead of making cross-process calls or switching between processes. The ability to run multiple applications within a single process dramatically increases server scalability."
Does anyone know what exactly is meant by a "native crash"?
Threads in Linux (in general) are separate process that share memory space, in Windows it's different and they're "threads" being scheduled under a parent process.
In the Java 1.1 & Linux 2.0 days you could get better Java performance by using green threads. That didn't last long, and around the time Java was being used for server-side applications it had mostly switched over to native threads.
So far as your actual question goes: There is little difference between the Java threading implementation on Linux & Windows.
[1] http://en.wikipedia.org/wiki/Green_threads#Green_threads_in_...
The Linux scheduler schedules processes; the Windows scheduler schedules threads. Via clone(), Linux can create a process that shares almost everything with its parent, and thereby looks mostly like a Windows thread.
With regards the JVM, there is little difference in this specific respect. The sync primitives available on each platform are a bit different though, as well as things like signals.
But I would say you would have definitely to watch for a) thread creation time and b) thread priorities (but for most of the applications these are not a problem)