Java Memory Management Tricks

51
©2015 GlobalLogic Inc.

Transcript of Java Memory Management Tricks

Page 1: Java Memory Management Tricks

©2015 GlobalLogic Inc.

Page 2: Java Memory Management Tricks

2

Java Memory Management Tricks

By Andrii Antilikatorov

Page 3: Java Memory Management Tricks

3

Page 4: Java Memory Management Tricks

4

Page 5: Java Memory Management Tricks

5

Agenda

Page 6: Java Memory Management Tricks

6

When we start to think about memory-related things?

Page 7: Java Memory Management Tricks

7

Battle of Garbage Collectors

Serial Parallel CMS G1

Page 8: Java Memory Management Tricks

8

Battle of Garbage Collectors

Do I really need to think about this?

Page 9: Java Memory Management Tricks

9

Battle of Garbage Collectors

Page 10: Java Memory Management Tricks

10

Serial GC

Runs great on low-end computers

Long pauses during garbage collections

Recommended for single-core CPU and heaps under 100Mb

…old, but not obsolete! ©

Page 11: Java Memory Management Tricks

11

Serial GC

Page 12: Java Memory Management Tricks

12

Parallel GC

Supports automatic self-tuning for optimal performance

Memory fragmentation

Perfectly consumes multi-core CPU power

Page 13: Java Memory Management Tricks

13

Parallel GC

Supports automatic self-tuning for optimal performance

Memory fragmentation

Perfectly consumes multi-core CPU power

Page 14: Java Memory Management Tricks

14

Concurrent Mark-Sweep GC

Works as Parallel GC in case of minor GC

Minimizes pauses, but sacrifices CPU and throughput

Consumes more memory (+20%)

Long pauses in case of concurrency mode failures

Works great with big data with long-living objects

Page 15: Java Memory Management Tricks

15

Concurrent Mark-Sweep GC

Works as Parallel GC in case of minor GC

Page 16: Java Memory Management Tricks

16

Garbage First (G1) GC

JEP 248: Make G1 the Default Garbage Collector on 32- and 64-bit server configurations starting from Java 9Designed for systems where limiting latency is more important than maximizing throughput

More accurate pause prediction

No memory fragmentation

High CPU utilization

Page 17: Java Memory Management Tricks

17

Garbage First (G1) GC

JEP 248: Make G1 the Default Garbage Collector on 32- and 64-bit server configurations starting from Java 9Designed for systems where limiting latency is more important than maximizing throughput

More accurate pause prediction

No memory fragmentation

High CPU utilization

Number of GC threads and Marking threads: ParallelGCThreads=?, ConcGCThreads=?

Heap region size: G1HeapRegionSize=?

Pause minimization: MaxGCPauseMillis=?

Heap memory allocation threshold: InitiatingHeapOccupancyPercent=?

Options for real geeks: UnlockExperimentalVMOptions, AggressiveOpts

Page 18: Java Memory Management Tricks

18

Memory Access

Heap

Direct Memory Access (Off-Heap)

Non-Direct ByteBuffer

Direct ByteBuffer

Page 19: Java Memory Management Tricks

19

Memory Access

Heap

Direct Memory Access (Off-Heap)

Non-Direct ByteBuffer

X Axis – No Of ReadingY Axis – Op/Second in Millions

Direct ByteBuffer

Page 20: Java Memory Management Tricks

20

Memory Access

Heap

Direct Memory Access (Off-Heap)

Non-Direct ByteBuffer

X Axis – No Of ReadingY Axis – Op/Second in Millions

Direct ByteBuffer

Page 21: Java Memory Management Tricks

21

Memory Access

Heap

Direct Memory Access (Off-Heap)

Non-Direct ByteBuffer

X Axis – No Of ReadingY Axis – Op/Second in Millions

Direct ByteBuffer

Page 22: Java Memory Management Tricks

22

Memory Access

Heap

Direct Memory Access (Off-Heap)

Non-Direct ByteBuffer

X Axis – No Of ReadingY Axis – Op/Second in Millions

Direct ByteBuffer

Page 23: Java Memory Management Tricks

23

Direct Memory Alignment in Java

Type alignment Page size alignment

Cache line alignment

Memory Alignment

Page 24: Java Memory Management Tricks

24

Direct Memory Alignment in Java

Type alignment Page size alignment

Cache line alignment

Memory Alignment“= new SomeObj()” always type-aligned.

“Unsafe.allocateMemory” always 8-bytes aligned.

“ByteBuffer.allocateDirect” …

Memory is 0-ed out automatically

Memory is page-aligned in JDK ≤ 1.6 and ‘8-bytes’ aligned in JDK ≥ 1.7

Memory is is freed as part of the ByteBuffer object GC

Page 25: Java Memory Management Tricks

25

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 26: Java Memory Management Tricks

26

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 27: Java Memory Management Tricks

27

Type-aligned vs unaligned Access Test

Number of pages

Alignment

Relative cost

Page 28: Java Memory Management Tricks

28

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 29: Java Memory Management Tricks

29

Cross-line cache access

Number of pages

Offset

Relative cost

Page 30: Java Memory Management Tricks

30

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 31: Java Memory Management Tricks

31

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 32: Java Memory Management Tricks

32

Cost of Access Based on Cache Line LocationOffset

Number of pagesRelative cost

Page 33: Java Memory Management Tricks

33

Comparing Aligned/Unaligned Access Performance

Type aligned access provides better performance than unaligned access.

Memory access that spans 2 cache lines has far worse performance than aligned mid-cache line access.

Cache line access performance changes based on cache line location.

Page 34: Java Memory Management Tricks

34

sun.misc.Unsafe

Direct Object Manipulations

Class Structure Manipulations

Arrays Manipulations

Synchronization Primitives

Low-level Memory Access

Low-level Memory Info

sun.misc.Unsafe

Page 35: Java Memory Management Tricks

35

sun.misc.Unsafe – Obtain Unobtainable

Unsafe unsafe = Unsafe.getUnsafe();

Page 36: Java Memory Management Tricks

36

sun.misc.Unsafe – Obtain Unobtainable

Unsafe unsafe = Unsafe.getUnsafe();

Page 37: Java Memory Management Tricks

37

sun.misc.Unsafe – Obtain Unobtainable

Page 38: Java Memory Management Tricks

38

Create an Instance Without Calling a Constructor

Need a “hack” to create new instance of Singleton

Need to avoid execution of heavy constructor logic

Custom serialization/deserialization.

Page 39: Java Memory Management Tricks

39

Create an Instance Without Calling a Constructor

Page 40: Java Memory Management Tricks

40

Create an Instance Without Calling a Constructor

Page 41: Java Memory Management Tricks

41

Create an Instance Without Calling a Constructor

50

50

0

Page 42: Java Memory Management Tricks

42

Measure Shallow Size of an Object

Sizes of data structures are fixed for 32/64bit platforms

According to ‘sizeof’ is not required because…

Java VM’s GC does complete memory management

…and you still can ‘measure’ the object by serializing to byte stream and looking at its length…

Page 43: Java Memory Management Tricks

43

Measure Shallow Size of an ObjectLooking through all

non-static fields

Calculating offset of the last field

Taking into account memory alignment

Page 44: Java Memory Management Tricks

44

Measure Shallow Size of an Object

Getting data from class struct

Converting signed integer to longTaking into account

header size

Page 45: Java Memory Management Tricks

45

Low-Level Memory Allocation

…for those who need extremely large arrays

Page 46: Java Memory Management Tricks

46

Low-Level Memory AllocationElement size

Direct memory allocation

Get/Put elements to array

Page 47: Java Memory Management Tricks

47

How About a Kind of Multiple Inheritance?

No multiple inheritance

Really?

Page 48: Java Memory Management Tricks

48

How About a Kind of Multiple Inheritance?

Page 49: Java Memory Management Tricks

49

How About a Kind of Multiple Inheritance?

Page 50: Java Memory Management Tricks

50

Page 51: Java Memory Management Tricks

©2015 GlobalLogic Inc.