JVM Internals (2015)

126
JVM INTERNALS Introduction to Virtual Machines and the JVM 1 Luiz Teston www.fracta.cc

Transcript of JVM Internals (2015)

Page 1: JVM Internals (2015)

JVM INTERNALSIntroduction to Virtual Machines and the JVM

1

Luiz Testonwww.fracta.cc

Page 2: JVM Internals (2015)

This presentation is available online atfracta.cc/presentations/jvm

2

Page 3: JVM Internals (2015)

VIRTUAL MACHINES

3

Page 4: JVM Internals (2015)

Mimics a Real Machine

4

Page 5: JVM Internals (2015)

Loads and execute code

5

Page 6: JVM Internals (2015)

CLASSLOADERS

6

Page 7: JVM Internals (2015)

Java classes are loaded on demand

7

Page 8: JVM Internals (2015)

How they are loaded is up to the classloader

8

Page 9: JVM Internals (2015)

9

Page 10: JVM Internals (2015)

10

Page 11: JVM Internals (2015)

Classloaders are hierarchical

11

Page 12: JVM Internals (2015)

12

Page 13: JVM Internals (2015)

13

Page 14: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

14

Page 15: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

15

Page 16: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

Not Here

16

Page 17: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

Not Here

Not Here

17

Page 18: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

Not Here

Not Here

Wait…

18

Page 19: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

Not Here

Not Here

Not Here

run time generated code

19

Page 20: JVM Internals (2015)

boor jars

LibraryA.jar

LibraryB.jar

Load class “Main”

Not Here

Not Here

Not Here

run time generated code Here!

20

Page 21: JVM Internals (2015)

HOW TO EXECUTE CODE?

21

Page 22: JVM Internals (2015)

INTERPRETING

22

Page 23: JVM Internals (2015)

Line of text AST

23

Page 24: JVM Internals (2015)

Simple example: sum of two numbers

24

Page 25: JVM Internals (2015)

25

Page 26: JVM Internals (2015)

int variable: j

26

Page 27: JVM Internals (2015)

int variable: jint variable: i

27

Page 28: JVM Internals (2015)

int variable: jint variable: i

sum

28

Page 29: JVM Internals (2015)

int variable: jint variable: i

sum

return

29

Page 30: JVM Internals (2015)

Errors usually are caught at runtime

30

Page 31: JVM Internals (2015)

COMPILING

31

Page 32: JVM Internals (2015)

Code compiled to binary prior to the execution.

32

Page 33: JVM Internals (2015)

Some errors can be caught at compile time

33

Page 34: JVM Internals (2015)

Binary can be: native code, VM bytecode and so on…

34

Page 35: JVM Internals (2015)

Bytecode: Byte sized OPCODE

35

Page 36: JVM Internals (2015)

REGISTER BASED VM

36

Page 37: JVM Internals (2015)

Works like your processor

37

Page 38: JVM Internals (2015)

Simple example: summing two numbers

38

Page 39: JVM Internals (2015)

R1 R2 RN…

39

Page 40: JVM Internals (2015)

R1 R2 RN…1

40

Page 41: JVM Internals (2015)

R1 R2 RN…1

+2

41

Page 42: JVM Internals (2015)

R1 R2 RN…3

42

Page 43: JVM Internals (2015)

STACK BASED VM

43

Page 44: JVM Internals (2015)

Works like you HP48G calculator

44

Page 45: JVM Internals (2015)

45

Page 46: JVM Internals (2015)

1

46

Page 47: JVM Internals (2015)

1

2

47

Page 48: JVM Internals (2015)

1

2+

48

Page 49: JVM Internals (2015)

3

49

Page 50: JVM Internals (2015)

JVM IS STACK BASED

50

Page 51: JVM Internals (2015)

Eventually byte code is compiled to native code on the fly

51

Page 52: JVM Internals (2015)

DYNAMIC MEMORY

52

Page 53: JVM Internals (2015)

C/C++ Approach: memory as a big array

53

Page 54: JVM Internals (2015)

index size variable

54

Page 55: JVM Internals (2015)

index size variable

1 1 i

55

Page 56: JVM Internals (2015)

index size variable

1 1 i

2 2 l

56

Page 57: JVM Internals (2015)

index size variable

1 1 i

2 2 l

3 4 c

57

Page 58: JVM Internals (2015)

index size variable

1 1 i

3 4 c

58

Page 59: JVM Internals (2015)

Few caveats for this approach

59

Page 60: JVM Internals (2015)

Possible memory fragmentation

60

Page 61: JVM Internals (2015)

Possible memory fragmentation

4 sized var doesn’t fit

61

Page 62: JVM Internals (2015)

Possible memory leak

62

Page 63: JVM Internals (2015)

Possible memory leak

used vars unused vars

63

Page 64: JVM Internals (2015)

Possible invalid pointer

64

Page 65: JVM Internals (2015)

Possible invalid pointer

variable pointing here

65

Page 66: JVM Internals (2015)

JVM based approach: Garbage Collector

66

Page 67: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

67

Page 68: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

68

Page 69: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

Wait…GC

69

Page 70: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

off you goGC

70

Page 71: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

t

71

Page 72: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

t ?

72

Page 73: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

t ?

Wait…

73

Page 74: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

Wait…

74

Page 75: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

off you go

75

Page 76: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

t2

76

Page 77: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

t2

t is still used within t2

77

Page 78: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

t2

? is not used…

78

Page 79: JVM Internals (2015)

Eden

Survivor 1

Survivor 2

GC

? t

t2

Whatever, I have plenty of memory

79

Page 80: JVM Internals (2015)

Few caveats for this approach

80

Page 81: JVM Internals (2015)

GC Wait…

GC needs to be properly configured

81

Page 82: JVM Internals (2015)

GC …

GC can be unpredictable

82

Page 83: JVM Internals (2015)

GC

No control over memory layout

83

Page 84: JVM Internals (2015)

GC

No control over memory layout

Let me do this job!

84

Page 85: JVM Internals (2015)

GCManaging memory

is hard!

85

Page 86: JVM Internals (2015)

GC Having a GC doing the hard work is good.

86

Page 87: JVM Internals (2015)

HANDS ON

87

Page 88: JVM Internals (2015)

• Create a .java file

• Compile it into a .class file

• Analyse its binary content

Page 89: JVM Internals (2015)

89

Page 90: JVM Internals (2015)

90

Page 91: JVM Internals (2015)

91

Page 92: JVM Internals (2015)

92

magic number

Page 93: JVM Internals (2015)

93

Source code info (can be removed by

compilation args)

Page 94: JVM Internals (2015)

94

Optimisations?

Page 95: JVM Internals (2015)

95

Yes, we appended to a string, but strings are immutable in Java.

Page 96: JVM Internals (2015)

96

the addTimes method

Page 97: JVM Internals (2015)

Time to take a look on the JVM Assembly code

97

Page 98: JVM Internals (2015)

98

Page 99: JVM Internals (2015)

99

Page 100: JVM Internals (2015)

100

main method

Page 101: JVM Internals (2015)

101

arg to int into a variable

Page 102: JVM Internals (2015)

102

new SumArg1Arg2Times

Page 103: JVM Internals (2015)

103

StringBuilder optimisation

Page 104: JVM Internals (2015)

104

Page 105: JVM Internals (2015)

105

Constructor

Page 106: JVM Internals (2015)

106

can you see the loop?

Page 107: JVM Internals (2015)

107

can you see the loop?

Page 108: JVM Internals (2015)

108

add method changing a field

Page 109: JVM Internals (2015)

Going further, let’s look the native assembly code

109

Page 110: JVM Internals (2015)

• Google for java dissablembler plugin. Install it (hdis-i386 or hdis-amd64)

• See the native assembly output

• Enjoy analysing it

Page 111: JVM Internals (2015)
Page 112: JVM Internals (2015)

large iteration count, so it can be JIT compiled

Page 113: JVM Internals (2015)
Page 114: JVM Internals (2015)

native code for java.lang.Object constructor

Page 115: JVM Internals (2015)
Page 116: JVM Internals (2015)

native code for addTimes

Page 117: JVM Internals (2015)

related to the loop within addTimes

Page 118: JVM Internals (2015)

native assembly

Page 119: JVM Internals (2015)

related bytecode

Page 120: JVM Internals (2015)
Page 121: JVM Internals (2015)

native code for add method

Page 122: JVM Internals (2015)

bytecode for add method

Page 123: JVM Internals (2015)

QUESTIONS?

Page 124: JVM Internals (2015)

WHO AM I

Luiz Teston

Principle Engineer, CTO at FRACTA • 15 years on the field, working on non trivial projects using

Java, C++ and functional programming• [email protected]• http://fracta.cc• http://linkedin.com/in/teston• http://twitter.com/FeuTeston

Page 125: JVM Internals (2015)

KEEP IN TOUCH

Feedback about the presentation appreciated.

[email protected]

www.fracta.cc

Page 126: JVM Internals (2015)

REFERENCES

• Garbage Collection: Algorithms for Automatic Dynamic Memory Management, by Richard Jones and Rafael Lins.

• Virtual Machines: Versatile Platforms for Systems and Processes, by Jim Smith and Ravi Nair.

• https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

• http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

• http://docs.oracle.com/javase/specs/jvms/se8/html/index.html

• http://mechanical-sympathy.blogspot.ie/2013/06/printing-generated-assembly-code-from.html

• http://www.slideshare.net/CharlesNutter/redev-2011-jvm-jit-for-dummies-what-the-jvm-does-with-your-bytecode-when-youre-not-looking

126