Slide 1

Slide 1 text

Pierre-Yves Ricau / Py @Piwai Square

Slide 2

Slide 2 text

@Piwai

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

@Piwai

Slide 5

Slide 5 text

@Piwai

Slide 6

Slide 6 text

@Piwai

Slide 7

Slide 7 text

@Piwai

Slide 8

Slide 8 text

@Piwai

Slide 9

Slide 9 text

@Piwai

Slide 10

Slide 10 text

@Piwai

Slide 11

Slide 11 text

@Piwai

Slide 12

Slide 12 text

@Piwai

Slide 13

Slide 13 text

@Piwai

Slide 14

Slide 14 text

@Piwai

Slide 15

Slide 15 text

@Piwai

Slide 16

Slide 16 text

@Piwai

Slide 17

Slide 17 text

@Piwai

Slide 18

Slide 18 text

@Piwai

Slide 19

Slide 19 text

Nuking Nasty Memory Leaks Devoxx US, 2017: https://youtu.be/fhE--eTEW84 @Piwai

Slide 20

Slide 20 text

@Piwai

Slide 21

Slide 21 text

* Instance of com.squareup.ui.permissions.PasscodeUnlockView | mAccessibilityCursorPosition = -1 | mAccessibilityDelegate = null | mAccessibilityTraversalAfterId = -1 | mAccessibilityTraversalBeforeId = -1 | mAccessibilityViewId = -1 | mAnimator = null | mAttachInfo = null | mAttributes = null | mBackground = android.graphics.drawable.ColorDrawable@328049760 (0x138da | mBackgroundRenderNode = android.view.RenderNode@338685248 (0x142fed40) | mBackgroundResource = 0 | mBackgroundSizeChanged = false | mBackgroundTint = null | mBottom = 1731 | mCachingFailed = false | mClipBounds = null @Piwai

Slide 22

Slide 22 text

@Piwai

Slide 23

Slide 23 text

class ActivityInspector : Reachability.Inspector { override fun expectedReachability(element: LeakTraceElement): Reachability { val fieldValue = element.getFieldReferenceValue("mDestroyed") if (fieldValue == null) { return Reachability.unknown() } return if (fieldValue == "true") { Reachability.unreachable("Activity#mDestroyed is true") } else { Reachability.reachable("Activity#mDestroyed is false") } } } @Piwai

Slide 24

Slide 24 text

@Piwai

Slide 25

Slide 25 text

@Piwai

Slide 26

Slide 26 text

@Piwai

Slide 27

Slide 27 text

@Piwai

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

private fun createGroupHash(): String { val uniqueString = if (excludedLeak) { leakTrace.firstElementExclusion.matching } else { leakTrace.leakCauses .joinToString(separator = "") { element -> val referenceName = element.reference!!.groupingName element.className + referenceName } } return uniqueString.createSHA1Hash() } @Piwai

Slide 30

Slide 30 text

@Piwai

Slide 31

Slide 31 text

@Piwai

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

@Piwai

Slide 34

Slide 34 text

@Piwai

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

@Piwai

Slide 37

Slide 37 text

New Heap Dump Parser??? @Piwai

Slide 38

Slide 38 text

fun open(heapDump: File): HprofParser { val inputStream = heapDump.inputStream() val channel = inputStream.channel val source = inputStream.source() .buffer() // ... } @Piwai

Slide 39

Slide 39 text

fun open(heapDump: File): HprofParser { val inputStream = heapDump.inputStream() val channel = inputStream.channel val source = inputStream.source() .buffer() // ... } fun moveTo(newPosition: Long) { if (position == newPosition) { return } source.buffer.clear() channel.position(newPosition) position = newPosition } @Piwai

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

@Piwai

Slide 43

Slide 43 text

@Piwai

Slide 44

Slide 44 text

while (!exhausted()) { // type of the record val tag = readUnsignedByte() // number of microseconds since the time stamp in the header skip(INT_SIZE) // number of bytes that follow and belong to this record val length = readUnsignedInt() when (tag) { STRING_IN_UTF8 -> { val callback = callbacks.get() val id = readId() val stringLength = length - idSize val string = readUtf8(stringLength) callback(StringRecord(id, string)) } // ... @Piwai

Slide 45

Slide 45 text

@Piwai

Slide 46

Slide 46 text

// ... LOAD_CLASS -> { val classSerialNumber = readInt() val id = readId() val stackTraceSerialNumber = readInt() val classNameStringId = readId() @Piwai

Slide 47

Slide 47 text

@Piwai

Slide 48

Slide 48 text

@Piwai

Slide 49

Slide 49 text

@Piwai

Slide 50

Slide 50 text

@Piwai

Slide 51

Slide 51 text

@Piwai

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

@Piwai

Slide 54

Slide 54 text

@Piwai

Slide 55

Slide 55 text

@Piwai

Slide 56

Slide 56 text

@Piwai

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

@Piwai

Slide 59

Slide 59 text

@Piwai

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

Pierre-Yves Ricau / Py @Piwai Square