Как я могу увидеть горячие классы и методы для SE и весеннего приложения через JMC - PullRequest
0 голосов
/ 10 июня 2019

Я хочу видеть горячие классы / методы (сколько они создали и сколько их размер для классов и сколько они вызывали / время выполнения для методов) через JMC (Java Mission Control). Для начала я разработал приложение se и spring для углубленного изучения этой темы.

1) Для этого я создал два простых приложения: SE https://github.com/Arxemond777/java_jmc_profiling и подпружиненный загрузчик https://github.com/Arxemond777/spring_jmc_jmeter_profiling
2 *) Для приложения Spring я генерирую нагрузку через @Sheduler (cron) и через Jmeter (https://github.com/Arxemond777/spring_jmc_jmeter_profiling/blob/master/src/main/resources/jmeter/Test%20Plan.jmx) jmeter сохраненная конфигурация
3) Я использую jms 5.5 (/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/jmc) и 6.0 (/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home / бен / СВК). Я пытаюсь запустить «начать запись полета» по умолчанию и с различными настройками для измерения точности, и изучить вкладки (jmc 5.5) «code» -> «Overview» «code» -> «Горячие методы» и (jmc 6.0) «Outline» -> «Метод профилирования».
4.1) Для моего приложения я иногда вижу (со временем записи 1 или 2 минуты), как вызывается метод CountSizeOfHashMap # a (), но иногда я не вижу этой информации, как на следующем экране https://yadi.sk/d/8xtFmga9Ufhp2Q Но я никогда не видел вот как вызывается CountSizeOfHashMap # b ().
4.2) Для моего весеннего приложения я никогда не видел, как вызывается Cron # scheduleFixedDelayTask () https://github.com/Arxemond777/spring_jmc_jmeter_profiling/blob/master/src/main/java/example/cron/Cron.java или GreetingController #reeting () / GreetingController # delay () / GreetingController #lessDelay () https://github.com/Arxemond777/spring_jmc_jmeter_profiling/blob/master/src/main/java/example/controller/GreetingController.java Я никогда не видел также, сколько экземпляров создано для одного цикла записи «записи полета» для https://github.com/Arxemond777/spring_jmc_jmeter_profiling/blob/master/src/main/java/example/dto/MyClass.java Я вижу только, как вызывается jdk-методы, например: j.u.HashMap.put () ets А как создаются классы jdk например: j.u.TimerThread ets

SE код приложения https://github.com/Arxemond777/java_jmc_profiling

public class CountSizeOfHashMap {

    static Map<Character, Long> map = new HashMap<>();

    public static void main(String[] args) {
        a();
    }

    private static void a() {
        for (long i = 0; i < 8_000L; i++) {
            map.put((char)i, i + b());
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        a();
    }

    private static long b() {
        final long l = new Random().nextInt(11);
        map.put('a', l);
        return l;
    }
}

Весеннее приложение https://github.com/Arxemond777/spring_jmc_jmeter_profiling GreetingController.java

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();
    private final String URL = "http://arxemond.ru";
    private final List<MyClass> myClasses = new ArrayList<>();

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                String.format(template, name));
    }

    @RequestMapping("/delay")
    public String delay() throws InterruptedException {
        final int delay = new Random().nextInt(3000 - 500 + 1) + 500;
        System.out.printf("delay: %d ms" + System.lineSeparator(), delay);
        Thread.sleep(delay);

        myClasses.add(new MyClass(String.valueOf(delay)));

        return restTemplate.getForEntity(URL, String.class).getBody();
    }

    @RequestMapping("/without-delay")
    public String withoutDelay() {
        return restTemplate.getForEntity(URL, String.class).getBody();
    }
}

Cron.java

@Service
public class Cron {
    @Scheduled(fixedDelay = 500)
    public void scheduleFixedDelayTask() { // 120
        System.err.println("Fixed delay task - " + System.currentTimeMillis() / 1000);
    }
}

MyClass.java

public class MyClass {
    private final String name;

    public MyClass(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Ожидаемое:

*) Я хочу увидеть, сколько классов создано и их размер, сколько вызванных методов и время выполнения методов для моих приложений se и spring.

Фактически:

*) Я вижу для моего SE-приложения, что метод CountSizeOfHashMap # a () иногда вызывался, но он определенно меньше, чем должен быть в реальном времени, и я никогда не видел, как вызывался метод CountSizeOfHashMap # b ().

*) Я никогда не видел, как вызывается (сколько) методов моей весны и там время выполнения. И как создаются мои классы из моего пакета (сколько экземпляров) и сколько они имеют размер.

...