SlideShare a Scribd company logo
https://middleofnowheregaming.files.wordpress.com/2015/04/game-of-thrones_20150327091828.jpg
Project Panama
Beyond the (JVM) Wall
www.hazelcast.com@noctarius2k
Disclaimer
This is not a rant - promised!
Just a little bit about JNI ;-)
www.hazelcast.com@noctarius2k
Disclaimer #2
If you haven’t seen Game of Thrones yet

keep your eyes closed!
www.hazelcast.com@noctarius2k
Disclaimer #3
Everything is provisional
Don’t take anything as final!
www.hazelcast.com@noctarius2k
Who’s that dude?
• Chris Engelbert
• Manager of Developer Relations @Hazelcast
• Java-Passionate (10+ years)
• Performance
• Garbage Collection
• JVM / Benchmark Fairytales
www.hazelcast.com@noctarius2k
I drink and I know things (sometimes)
www.hazelcast.com@noctarius2k
Project Panama
The True Native Love
www.hazelcast.com@noctarius2k
Unite Enemies
C/C++Java
www.hazelcast.com@noctarius2k
JNI! That's a good name for you!
www.hazelcast.com@noctarius2k
JNI brings interaction between
native code and Java
#include <unistd.h>
int pid = getpid();
simple kernel call
www.hazelcast.com@noctarius2k
JNI brings interaction between
native code and Java
#include <unistd.h>
int pid = getpid();
simple kernel call header import
www.hazelcast.com@noctarius2k
JNI brings interaction between
native code and Java
#include <unistd.h>
int pid = getpid();
simple kernel call header import
request PID
www.hazelcast.com@noctarius2k
#include <unistd.h>
int pid = getpid();
Isn’t that easy in C?
www.hazelcast.com@noctarius2k
You know nothing, of JNI!
www.hazelcast.com@noctarius2k
Starting with the C part :-)
www.hazelcast.com@noctarius2k
Starting with the C part :-)
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
www.hazelcast.com@noctarius2k
Starting with the C part :-)
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
export it as a JNI method
www.hazelcast.com@noctarius2k
Starting with the C part :-)
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
export it as a JNI method
Java Classname
www.hazelcast.com@noctarius2k
Starting with the C part :-)
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
export it as a JNI method
Java Classname Java Methodname
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
Starting with the C part :-)
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
Starting with the C part :-)
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
kernel call
www.hazelcast.com@noctarius2k
When you think you just won…
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
Starting with the C part :-)
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
Starting with the C part :-)
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
JNI version definition
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
done, easy right?
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
oh, missing the Java side, still
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
public class ProcessIdentifier {
static {
System.loadLibrary("processidentifier");
}
public native void getProcessId();
}
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
oh, missing the Java side, still
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
public class ProcessIdentifier {
static {
System.loadLibrary("processidentifier");
}
public native void getProcessId();
}
Java Classname
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
oh, missing the Java side, still
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
public class ProcessIdentifier {
static {
System.loadLibrary("processidentifier");
}
public native void getProcessId();
}
Java Classname Java Methodname
www.hazelcast.com@noctarius2k
extern C {
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
}
JNIEXPORT int JNICALL
Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObject) {
return getpid();
}
ok, ok, now we’re done!
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
return JNI_VERSION_1_2;
}
public class ProcessIdentifier {
static {
System.loadLibrary("processidentifier");
}
public native void getProcessId();
}
www.hazelcast.com@noctarius2k
Wasn’t that easy?
www.hazelcast.com@noctarius2k
Wasn’t that easy?
but remember…
www.hazelcast.com@noctarius2k
Everybody struggles with JNI!
www.hazelcast.com@noctarius2k
meanwhile behind

the wall…
www.hazelcast.com@noctarius2k
Java 9 to the rescue
www.hazelcast.com@noctarius2k
Java 9 to the rescue
long pid = ProcessHandle.current().getPid();
www.hazelcast.com@noctarius2k
Java 9 to the rescue
long pid = ProcessHandle.current().getPid();
convenient, eh?
www.hazelcast.com@noctarius2k
but how many can
just update?
www.hazelcast.com@noctarius2k
So? JNI?
www.hazelcast.com@noctarius2k
So? JNI? - NO!
www.hazelcast.com@noctarius2k
A Song From Methods And Handles
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
type definition
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
returntypetype definition
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
returntypetype definition
Java Classname
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
returntypetype definition
Java Classname Java Methodname
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
returntypetype definition
Java Classname Java Methodnamecall the new callsite
www.hazelcast.com@noctarius2k
MethodHandles
So? What’s the deal? Java 7, right?
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findVirtual(ProcessIdentifier.class, "getProcessId", type);
int pid = mh.invokeExact();
virtual call
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findNative(null, "getpid", type);
int pid = mh.invokeExact();
native
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findNative(null, "getpid", type);
int pid = mh.invokeExact();
native
native call
www.hazelcast.com@noctarius2k
MethodHandles
MethodType type = MethodType.methodType(int.class);
MethodHandle mh = MethodHandles.lookup()
.findNative(null, "getpid", type);
int pid = mh.invokeExact();
native
native call null = kernel call

otherwise lib name
www.hazelcast.com@noctarius2k
Easier than taking
the Iron Throne!
www.hazelcast.com@noctarius2k
The Mad King
www.hazelcast.com@noctarius2k
Pointer with sun.misc.Unsafe
Unsafe unsafe = getUnsafeWithMagic();
long ptr = unsafe.allocateMemory(20);
byte val = unsafe.getByte(ptr + 5);
www.hazelcast.com@noctarius2k
Pointer with sun.misc.Unsafe
Unsafe unsafe = getUnsafeWithMagic();
long ptr = unsafe.allocateMemory(20);
byte val = unsafe.getByte(ptr + 5);
retrieve sun.misc.Unsafe instance
www.hazelcast.com@noctarius2k
Pointer with sun.misc.Unsafe
Unsafe unsafe = getUnsafeWithMagic();
long ptr = unsafe.allocateMemory(20);
byte val = unsafe.getByte(ptr + 5);
retrieve sun.misc.Unsafe instance
allocate 20 bytes
www.hazelcast.com@noctarius2k
Pointer with sun.misc.Unsafe
Unsafe unsafe = getUnsafeWithMagic();
long ptr = unsafe.allocateMemory(20);
byte val = unsafe.getByte(ptr + 5);
retrieve sun.misc.Unsafe instance
allocate 20 bytesget byte at ptr+5
www.hazelcast.com@noctarius2k
So I die, for using Unsafe?
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
LayoutType<Byte> layout =
NativeLibrary.createLayout(byte.class);
try (Scope scope = new NativeScope()) {
Pointer<Byte> p = scope.allocate(layout, 20);
Reference<Byte> ref = p.offset(5).deref();
byte val = ref.get();
}
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
LayoutType<Byte> layout =
NativeLibrary.createLayout(byte.class);
try (Scope scope = new NativeScope()) {
Pointer<Byte> p = scope.allocate(layout, 20);
Reference<Byte> ref = p.offset(5).deref();
byte val = ref.get();
}
byte-array
layout
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
LayoutType<Byte> layout =
NativeLibrary.createLayout(byte.class);
try (Scope scope = new NativeScope()) {
Pointer<Byte> p = scope.allocate(layout, 20);
Reference<Byte> ref = p.offset(5).deref();
byte val = ref.get();
}
byte-array
layout
create a
scope
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
LayoutType<Byte> layout =
NativeLibrary.createLayout(byte.class);
try (Scope scope = new NativeScope()) {
Pointer<Byte> p = scope.allocate(layout, 20);
Reference<Byte> ref = p.offset(5).deref();
byte val = ref.get();
}
byte-array
layout
create a
scope
allocate

20 bytes
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
LayoutType<Byte> layout =
NativeLibrary.createLayout(byte.class);
try (Scope scope = new NativeScope()) {
Pointer<Byte> p = scope.allocate(layout, 20);
Reference<Byte> ref = p.offset(5).deref();
byte val = ref.get();
}
byte-array
layout
create a
scope
allocate

20 bytes
get byte

at ptr+5
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
www.hazelcast.com@noctarius2k
Who needs Unsafe anyways
www.hazelcast.com@noctarius2k
A REAL NULL POINTER! THANK YOU JAVA!
Who needs Unsafe anyways
www.hazelcast.com@noctarius2k
About Structs and
other Creatures
www.hazelcast.com@noctarius2k
Struct in Java? No, Layout!
typedef struct {
int32_t val;
Node next;
} Node;
www.hazelcast.com@noctarius2k
Same LinkedList Node in Java
@LayoutDesc({"x:jint:4", "y:Node:8"})
public interface Node extends Layout {
// …
}
www.hazelcast.com@noctarius2k
@LayoutDesc({"x:jint:4", "y:Node:8"})
public interface Node extends Layout {
interface EffectiveAddress {
IntPointer val();
Pointer<Node> next();
}
// …
}
Same LinkedList Node in Java
www.hazelcast.com@noctarius2k
@LayoutDesc({"x:jint:4", "y:Node:8"})
public interface Node extends Layout {
Node.EffectiveAddress EA();
long sizeof();
int val();
// …
}
Same LinkedList Node in Java
www.hazelcast.com@noctarius2k
@LayoutDesc({"x:jint:4", "y:Node:8"})
public interface Node extends Layout {
Node next();
void val(int val);
void next(Node next);
String toString();
}
Same LinkedList Node in Java
www.hazelcast.com@noctarius2k
Scope scope = new NativeScope();
Pointer<Node> ptr = scope.allocate(Node.class);
Node node = ptr.getLayout();
int val = node.val();
Node next = node.next();
Creating layouted Objects
www.hazelcast.com@noctarius2k
I slayed the Mad King
www.hazelcast.com@noctarius2k
Value Isn’t A Pit. Value Is A Ladder.
www.hazelcast.com@noctarius2k
Value Types
value class Point {
int x;
int y;
}
www.hazelcast.com@noctarius2k
Value Types
Point point = __make Point(1, 2);
int x = point.x;
int y = point.y;
www.hazelcast.com@noctarius2k
Yet another layout?
www.hazelcast.com@noctarius2k
class Point {}
Point[] points = …
Arrays of Points
www.hazelcast.com@noctarius2k
value class Point {}
Point[] points = …
Arrays of Points
www.hazelcast.com@noctarius2k
I’m feeling so Assembler today
www.hazelcast.com@noctarius2k
Coding a Vector-Function in Java
MethodType type = MethodType.methodType(
Float.class, Float.class, Float.class);
MethodHandle m256_vadds = CodeSnippets
.make(..., type, …);
m256_vadds.invokeExact(out, in1, in2);
low-level
www.hazelcast.com@noctarius2k
Coding a Vector-Function in Java
high-level
interface Vector<E, S extends Shape<Vector?, S>> {
Vector<E, S> add (Vector<E, S> other);
Vector<E, S> mul (Vector<E, S> other);
Vector<E, S> and (Vector<E, S> other);
// ... more operations
}
www.hazelcast.com@noctarius2k
Coding a Vector-Function in Java
high-level
void addVector(float[] left, float[] right,
float[] res, int length) {
// …
}
www.hazelcast.com@noctarius2k
Coding a Vector-Function in Java
high-level
void addVector(float[] left, float[] right,
float[] res, int length) {
FloatVector<S256Bit> l =
float256FromArray(left, length);
FloatVector<S256Bit> r =
float256FromArray(right, length);
// …
}
www.hazelcast.com@noctarius2k
Coding a Vector-Function in Java
high-level
void addVector(float[] left, float[] right,
float[] res, int length) {
// …
FloatVector<S256Bit> lr = l.add(r);
lr.intoArray(res, length);
}
www.hazelcast.com@noctarius2k
Razersharp tooling
www.hazelcast.com@noctarius2k
So what do we expect?
www.hazelcast.com@noctarius2k
Peace with the Dragons
www.hazelcast.com@noctarius2k
Peace with the Dragons
C / C++
www.hazelcast.com@noctarius2k
Painless communication…
www.hazelcast.com@noctarius2k
Painless communication…
…between native and Java code
www.hazelcast.com@noctarius2k
More fun…
www.hazelcast.com@noctarius2k
More fun…
… and faster code …
www.hazelcast.com@noctarius2k
More fun…
…without JNI
… and faster code …
www.hazelcast.com@noctarius2k
Thank You &
George R.R. Martin
www.hazelcast.com@noctarius2k
More information:
• http://openjdk.java.net/projects/valhalla/
• http://openjdk.java.net/projects/panama/
• http://cr.openjdk.java.net/~jrose/values/values-0.html
• http://blog.codefx.org/java/dev/the-road-to-valhalla/
• http://openjdk.java.net/jeps/191
• https://www.youtube.com/watch?v=JR1zI5gLhRM
• https://github.com/J9Java/panama-layout-prototype
• https://developer.ibm.com/open/openprojects/project-panama-layout-prototype/
• https://www.youtube.com/watch?v=Tc9vs_HFHVo
• https://www.youtube.com/watch?v=Z2XgO1H6xPM
Thank You!
www.hazelcast.com@noctarius2k
Thank You!
Any Questions?
@noctarius2k
http://www.sourceprojects.org
http://github.com/noctarius
@hazelcast
http://www.hazelcast.com
http://www.hazelcast.org
http://github.com/hazelcast
www.hazelcast.com@noctarius2k
German
speaking?
JVM related talk
on Slack
Get your own invite at:
https://slackin-jvm-german.herokuapp.com

More Related Content

PDF
Ajax World Comet Talk
rajivmordani
 
PDF
Performance #1: Memory
Yonatan Levin
 
ODP
To inject or not to inject: CDI is the question
Antonio Goncalves
 
PDF
Construire une application JavaFX 8 avec gradle
Thierry Wasylczenko
 
PDF
#JavaFX.forReal() - ElsassJUG
Thierry Wasylczenko
 
RTF
Easy Button
Adam Dale
 
PDF
Are app servers still fascinating
Antonio Goncalves
 
PDF
PostgreSQL Open SV 2018
artgillespie
 
Ajax World Comet Talk
rajivmordani
 
Performance #1: Memory
Yonatan Levin
 
To inject or not to inject: CDI is the question
Antonio Goncalves
 
Construire une application JavaFX 8 avec gradle
Thierry Wasylczenko
 
#JavaFX.forReal() - ElsassJUG
Thierry Wasylczenko
 
Easy Button
Adam Dale
 
Are app servers still fascinating
Antonio Goncalves
 
PostgreSQL Open SV 2018
artgillespie
 

What's hot (20)

PPTX
Java Bytecode: Passing Parameters
Anton Arhipov
 
PDF
Cassandra Summit EU 2014 - Testing Cassandra Applications
Christopher Batey
 
PPTX
When Enterprise Java Micro Profile meets Angular
Antonio Goncalves
 
PDF
Deep Dive into Zone.JS
Ilia Idakiev
 
PDF
Fault tolerant microservices - LJC Skills Matter 4thNov2014
Christopher Batey
 
PDF
Tests unitaires mock_kesako_20130516
SOAT
 
PDF
Code as Risk
Kevlin Henney
 
PDF
ReactJS for Programmers
David Rodenas
 
PDF
Process Doppelgänging
KarlFrank99
 
PPTX
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
Danny Preussler
 
PDF
LJC Conference 2014 Cassandra for Java Developers
Christopher Batey
 
PDF
Server1
FahriIrawan3
 
PDF
Redux for ReactJS Programmers
David Rodenas
 
PDF
Android code puzzlers + tips & tricks
NLJUG
 
PDF
JavaOne 2017 - The hitchhiker’s guide to Java class reloading
Anton Arhipov
 
PDF
Java设置环境变量
Zianed Hou
 
DOCX
201913046 wahyu septiansyah network programing
wahyuseptiansyah
 
PDF
Unit Testing: Special Cases
Ciklum Ukraine
 
PDF
Cassandra is great but how do I test my application?
Christopher Batey
 
Java Bytecode: Passing Parameters
Anton Arhipov
 
Cassandra Summit EU 2014 - Testing Cassandra Applications
Christopher Batey
 
When Enterprise Java Micro Profile meets Angular
Antonio Goncalves
 
Deep Dive into Zone.JS
Ilia Idakiev
 
Fault tolerant microservices - LJC Skills Matter 4thNov2014
Christopher Batey
 
Tests unitaires mock_kesako_20130516
SOAT
 
Code as Risk
Kevlin Henney
 
ReactJS for Programmers
David Rodenas
 
Process Doppelgänging
KarlFrank99
 
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
Danny Preussler
 
LJC Conference 2014 Cassandra for Java Developers
Christopher Batey
 
Server1
FahriIrawan3
 
Redux for ReactJS Programmers
David Rodenas
 
Android code puzzlers + tips & tricks
NLJUG
 
JavaOne 2017 - The hitchhiker’s guide to Java class reloading
Anton Arhipov
 
Java设置环境变量
Zianed Hou
 
201913046 wahyu septiansyah network programing
wahyuseptiansyah
 
Unit Testing: Special Cases
Ciklum Ukraine
 
Cassandra is great but how do I test my application?
Christopher Batey
 
Ad

Viewers also liked (20)

PDF
CBOR - The Better JSON
Christoph Engelbert
 
PDF
TDD mit JUnit und Mockito
Tobias Trelle
 
PPTX
Its all about the domain honey
Carola Lilienthal
 
PDF
Javaslang Talk @ Javaland 2017
David Schmitz
 
PDF
Configuration beyond Java EE 8
Anatole Tresch
 
PDF
10 STEPS TO OVERCOME A LOUSY ATTITUDE
Mark Gilroy
 
PDF
Gimme Caching - The JCache Way
Christoph Engelbert
 
PDF
Distributed Computing with Hazelcast - Brazil Tour
Christoph Engelbert
 
PPT
色彩センスのいらない配色講座
Mariko Yamaguchi
 
PDF
In-Memory Distributed Computing - Porto Tech Hub
Christoph Engelbert
 
PDF
The Marketer's Guide To Customer Interviews
Good Funnel
 
PDF
Design in Tech Report 2017
John Maeda
 
PDF
From pair programming to mob architecting
Carola Lilienthal
 
PDF
DDD and reactive frameworks
codepitbull
 
PDF
Idea21 2015
Fabio Zancuoghi
 
PDF
Intelligence artificielle en médecine
Jean-Emmanuel Bibault Bibault, MD, PhD
 
PDF
孤独なフリーランサー
107steps
 
PDF
Rapport de Triple-C sur l'audience du Carn@val numérique 1re saison
Michel Guillou
 
PDF
Aif gt-170317slide
Luigi Taccone
 
PPTX
Knack success story - Gamification in recruitment - Manu Melwin Joy
manumelwin
 
CBOR - The Better JSON
Christoph Engelbert
 
TDD mit JUnit und Mockito
Tobias Trelle
 
Its all about the domain honey
Carola Lilienthal
 
Javaslang Talk @ Javaland 2017
David Schmitz
 
Configuration beyond Java EE 8
Anatole Tresch
 
10 STEPS TO OVERCOME A LOUSY ATTITUDE
Mark Gilroy
 
Gimme Caching - The JCache Way
Christoph Engelbert
 
Distributed Computing with Hazelcast - Brazil Tour
Christoph Engelbert
 
色彩センスのいらない配色講座
Mariko Yamaguchi
 
In-Memory Distributed Computing - Porto Tech Hub
Christoph Engelbert
 
The Marketer's Guide To Customer Interviews
Good Funnel
 
Design in Tech Report 2017
John Maeda
 
From pair programming to mob architecting
Carola Lilienthal
 
DDD and reactive frameworks
codepitbull
 
Idea21 2015
Fabio Zancuoghi
 
Intelligence artificielle en médecine
Jean-Emmanuel Bibault Bibault, MD, PhD
 
孤独なフリーランサー
107steps
 
Rapport de Triple-C sur l'audience du Carn@val numérique 1re saison
Michel Guillou
 
Aif gt-170317slide
Luigi Taccone
 
Knack success story - Gamification in recruitment - Manu Melwin Joy
manumelwin
 
Ad

Similar to Project Panama - Beyond the (JVM) Wall (20)

PPTX
Android ndk
Khiem-Kim Ho Xuan
 
KEY
Curator intro
Jordan Zimmerman
 
PDF
JMC/JFR: Kotlin spezial
Miro Wengner
 
PDF
Native Java with GraalVM
Sylvain Wallez
 
PDF
Tomorrow Java
José Maria Silveira Neto
 
PDF
The Power of the JVM: Applied Polyglot Projects with Java and JavaScript
Hazelcast
 
PDF
Keep your Wicket application in production
Martijn Dashorst
 
PPTX
Fields in Java and Kotlin and what to expect.pptx
João Esperancinha
 
DOCX
Assignment #2.classpathAssignment #2.project Assig.docx
fredharris32
 
PDF
Make it test-driven with CDI!
rafaelliu
 
PDF
Eric Lafortune - The Jack and Jill build system
GuardSquare
 
PDF
A new execution model for Nashorn in Java 9
Marcus Lagergren
 
PDF
Inside the JVM - Follow the white rabbit! / Breizh JUG
Sylvain Wallez
 
ZIP
Building Web Apps Sanely - EclipseCon 2010
Chris Ramsdale
 
PDF
Inside the JVM - Follow the white rabbit!
Sylvain Wallez
 
PDF
Portable, secure, and lightweight: Wasm runtimes and their use-cases - Natali...
Wey Wey Web
 
PPTX
Java script for web developer
Chalermpon Areepong
 
PDF
Devoxx uk 2014 High performance in-memory Java with open source
David Brimley
 
PDF
High Performance Django 1
DjangoCon2008
 
PDF
High Performance Django
DjangoCon2008
 
Android ndk
Khiem-Kim Ho Xuan
 
Curator intro
Jordan Zimmerman
 
JMC/JFR: Kotlin spezial
Miro Wengner
 
Native Java with GraalVM
Sylvain Wallez
 
The Power of the JVM: Applied Polyglot Projects with Java and JavaScript
Hazelcast
 
Keep your Wicket application in production
Martijn Dashorst
 
Fields in Java and Kotlin and what to expect.pptx
João Esperancinha
 
Assignment #2.classpathAssignment #2.project Assig.docx
fredharris32
 
Make it test-driven with CDI!
rafaelliu
 
Eric Lafortune - The Jack and Jill build system
GuardSquare
 
A new execution model for Nashorn in Java 9
Marcus Lagergren
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Sylvain Wallez
 
Building Web Apps Sanely - EclipseCon 2010
Chris Ramsdale
 
Inside the JVM - Follow the white rabbit!
Sylvain Wallez
 
Portable, secure, and lightweight: Wasm runtimes and their use-cases - Natali...
Wey Wey Web
 
Java script for web developer
Chalermpon Areepong
 
Devoxx uk 2014 High performance in-memory Java with open source
David Brimley
 
High Performance Django 1
DjangoCon2008
 
High Performance Django
DjangoCon2008
 

More from Christoph Engelbert (20)

PDF
Postgres on Kubernetes - Dos and Donts.pdf
Christoph Engelbert
 
PDF
Data Pipeline Plumbing
Christoph Engelbert
 
PDF
Gute Nachrichten, Schlechte Nachrichten
Christoph Engelbert
 
PDF
Of Farm Topologies and Time-Series Data
Christoph Engelbert
 
PDF
What I learned about IoT Security ... and why it's so hard!
Christoph Engelbert
 
PDF
PostgreSQL: The Time-Series Database You (Actually) Want
Christoph Engelbert
 
PDF
Road to (Enterprise) Observability
Christoph Engelbert
 
PDF
Oops-Less Operation
Christoph Engelbert
 
PDF
Instan(t)a-neous Monitoring
Christoph Engelbert
 
PDF
Don't Go, Java!
Christoph Engelbert
 
PDF
TypeScript Go(es) Embedded
Christoph Engelbert
 
PDF
Hazelcast Jet - Riding the Jet Streams
Christoph Engelbert
 
PDF
The Delivery Hero - A Simpsons As A Service Storyboard
Christoph Engelbert
 
PDF
A Post-Apocalyptic sun.misc.Unsafe World
Christoph Engelbert
 
PDF
In-Memory Computing - Distributed Systems - Devoxx UK 2015
Christoph Engelbert
 
PDF
JCache - Gimme Caching - JavaLand
Christoph Engelbert
 
PDF
Distributed Computing - An Interactive Introduction
Christoph Engelbert
 
PDF
Gimme Caching - The JCache Way
Christoph Engelbert
 
PDF
Gimme Caching, the Hazelcast JCache Way
Christoph Engelbert
 
PDF
Unsafe Java World - Crossing the Borderline - JokerConf 2014 Saint Petersburg
Christoph Engelbert
 
Postgres on Kubernetes - Dos and Donts.pdf
Christoph Engelbert
 
Data Pipeline Plumbing
Christoph Engelbert
 
Gute Nachrichten, Schlechte Nachrichten
Christoph Engelbert
 
Of Farm Topologies and Time-Series Data
Christoph Engelbert
 
What I learned about IoT Security ... and why it's so hard!
Christoph Engelbert
 
PostgreSQL: The Time-Series Database You (Actually) Want
Christoph Engelbert
 
Road to (Enterprise) Observability
Christoph Engelbert
 
Oops-Less Operation
Christoph Engelbert
 
Instan(t)a-neous Monitoring
Christoph Engelbert
 
Don't Go, Java!
Christoph Engelbert
 
TypeScript Go(es) Embedded
Christoph Engelbert
 
Hazelcast Jet - Riding the Jet Streams
Christoph Engelbert
 
The Delivery Hero - A Simpsons As A Service Storyboard
Christoph Engelbert
 
A Post-Apocalyptic sun.misc.Unsafe World
Christoph Engelbert
 
In-Memory Computing - Distributed Systems - Devoxx UK 2015
Christoph Engelbert
 
JCache - Gimme Caching - JavaLand
Christoph Engelbert
 
Distributed Computing - An Interactive Introduction
Christoph Engelbert
 
Gimme Caching - The JCache Way
Christoph Engelbert
 
Gimme Caching, the Hazelcast JCache Way
Christoph Engelbert
 
Unsafe Java World - Crossing the Borderline - JokerConf 2014 Saint Petersburg
Christoph Engelbert
 

Recently uploaded (20)

PDF
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
PDF
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
PDF
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
PPTX
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
PDF
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
PPTX
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PPTX
Role Of Python In Programing Language.pptx
jaykoshti048
 
PDF
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
PDF
Adobe Illustrator Crack Full Download (Latest Version 2025) Pre-Activated
imang66g
 
PPTX
Presentation about variables and constant.pptx
safalsingh810
 
PDF
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
PPTX
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
DOCX
Can You Build Dashboards Using Open Source Visualization Tool.docx
Varsha Nayak
 
PPTX
Maximizing Revenue with Marketo Measure: A Deep Dive into Multi-Touch Attribu...
bbedford2
 
PDF
An Experience-Based Look at AI Lead Generation Pricing, Features & B2B Results
Thomas albart
 
PDF
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
PPTX
Presentation about variables and constant.pptx
kr2589474
 
PDF
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
PPTX
Can You Build Dashboards Using Open Source Visualization Tool.pptx
Varsha Nayak
 
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
Role Of Python In Programing Language.pptx
jaykoshti048
 
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
Adobe Illustrator Crack Full Download (Latest Version 2025) Pre-Activated
imang66g
 
Presentation about variables and constant.pptx
safalsingh810
 
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
Can You Build Dashboards Using Open Source Visualization Tool.docx
Varsha Nayak
 
Maximizing Revenue with Marketo Measure: A Deep Dive into Multi-Touch Attribu...
bbedford2
 
An Experience-Based Look at AI Lead Generation Pricing, Features & B2B Results
Thomas albart
 
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
Presentation about variables and constant.pptx
kr2589474
 
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
Can You Build Dashboards Using Open Source Visualization Tool.pptx
Varsha Nayak
 

Project Panama - Beyond the (JVM) Wall