我想通过JMC(Java任务控制)查看热门的类/方法(它们创建了多少类,它们的大小以及它们为方法调用/执行的时间)。首先,我做了一个se和一个spring应用来深入了解这个主题。
1)为此,我创建了两个简单的应用程序:SE https://github.com/Arxemond777/java_jmc_profiling和spring-boot https://github.com/Arxemond777/spring_jmc_jmeter_profiling
2 *)对于spring app,我通过@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 / bin / jmc)。
我尝试默认运行“开始飞行记录”,并使用不同的设置来测量精度,然后检查选项卡(jmc 5.5)“代码”->“概述”“代码”->“热门方法”和(jmc 6.0)“概述” ->“方法分析”。
4.1)对于我的se应用程序,我有时(以记录时间1或2分钟)看到CountSizeOfHashMap#a()方法的调用方式,但有时却看不到以下信息,例如跟随屏幕https://yadi.sk/d/8xtFmga9Ufhp2Q,但我从未见过如何调用CountSizeOfHashMap#b()。
4.2)对于我的spring应用程序,我从未见过如何调用Cron#scheduleFixedDelayTask()https://github.com/Arxemond777/spring_jmc_jmeter_profiling/blob/master/src/main/java/example/cron/Cron.java
或GreetingController#greeting()/ GreetingController#delay()/ GreetingController#withoutDelay()
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()方法。>
*)我从未见过spring方法的调用次数(执行次数)以及执行时间。以及如何从我的数据包(多少个实例)中创建类以及它们的大小。