/* * Copyright (c) 2013-2016 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.jarscan.methodsizehisto; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_COMMA; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_STATIC_INIT; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_NEWLINE; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.adoptopenjdk.jitwatch.jarscan.IJarScanOperation; import org.adoptopenjdk.jitwatch.model.MemberSignatureParts; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction; import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode; public class MethodSizeHistoOperation implements IJarScanOperation { private Map<Integer, Integer> methodSizeMap = new HashMap<>(); public MethodSizeHistoOperation() { } @Override public String getReport() { List<Map.Entry<Integer, Integer>> sortedList = new ArrayList<>(methodSizeMap.entrySet()); Collections.sort(sortedList, new Comparator<Map.Entry<Integer, Integer>>() { @Override public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } }); StringBuilder builder = new StringBuilder(); for (Map.Entry<Integer, Integer> entry : sortedList) { int bytecodeSize = entry.getKey(); int count = entry.getValue(); builder.append(bytecodeSize); builder.append(C_COMMA); builder.append(count); builder.append(S_NEWLINE); } return builder.toString(); } @Override public void processInstructions(String className, MemberBytecode memberBytecode) { List<BytecodeInstruction> instructions = memberBytecode.getInstructions(); if (instructions != null && instructions.size() > 0) { BytecodeInstruction lastInstruction = instructions.get(instructions.size() - 1); // final instruction is a return for 1 byte int bcSize = 1 + lastInstruction.getOffset(); MemberSignatureParts msp = memberBytecode.getMemberSignatureParts(); if (!S_STATIC_INIT.equals(msp.getMemberName())) { Integer existingCount = methodSizeMap.get(bcSize); if (existingCount == null) { methodSizeMap.put(bcSize, 1); } else { methodSizeMap.put(bcSize, existingCount + 1); } } } } }