# 在 VS Code 中使用 GraalVM 和 VisualVM 进行性能和内存分析

Jetbrain最近的一项调查显示，大约五分之一的Java开发人员使用了visual vm，这使得它成为生态系统中使用最广泛的性能分析工具。

# 创建项目

## 实现逻辑

package com.example;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
@Controller("/")
public class FibonacciController {
private static final StringBuilder LOG = new StringBuilder();
@Get(uri = "/nthFibonacci/{nth}", produces = MediaType.TEXT_PLAIN)
public String nthFibonacci(Integer nth) {
long[] counter = new long[] {0};
long start = System.currentTimeMillis();
LOG.append("Fibonacci number #").append(nth).append(" is ");
LOG.append(computeNthFibonacci(nth, counter));
LOG.append(" (computed in ").append(System.currentTimeMillis() - start).append(" ms, ").append(counter[0]).append(" steps)\n");
return LOG.toString();
}
private static long computeNthFibonacci(int nth, long[] counter) {
counter[0]++;
if (nth == 0 || nth == 1) return nth;
return computeNthFibonacci(nth - 1, counter) + computeNthFibonacci(nth - 2, counter);
}
}

# 项目分析

## 性能分析

• localhost:8080/nthFibonacci/35
• localhost:8080/nthFibonacci/40
• localhost:8080/nthFibonacci/45

Fibonacci number #35 is 9227465 (computed in 61 ms, 29860703 steps)

Fibonacci number #40 is 102334155 (computed in 573 ms, 331160281 steps)

Fibonacci number #45 is 1134903170 (computed in 6367 ms, 3672623805 steps)

FibonacciController.java内容更改为改进的版本并保存文件:

package com.example;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import java.util.HashMap;
import java.util.Map;
@Controller("/")
public class FibonacciController {
private static final StringBuilder LOG = new StringBuilder();
private static final Map<Integer, Long> CACHE = new HashMap();
@Get(uri = "/nthFibonacci/{nth}", produces = MediaType.TEXT_PLAIN)
public String nthFibonacci(Integer nth) {
long[] counter = new long[] {0};
long start = System.currentTimeMillis();
LOG.append("Fibonacci number #").append(nth).append(" is ");
LOG.append(computeNthFibonacci(nth, counter));
LOG.append(" (computed in ").append(System.currentTimeMillis() - start).append(" ms, ").append(counter[0]).append(" steps)\n");
return LOG.toString();
}
private static long computeNthFibonacci(int nth, long[] counter) {
counter[0]++;
if (nth == 0 || nth == 1) return nth;
Long result = CACHE.get(nth);
if (result == null) {
result = computeNthFibonacci(nth - 1, counter) + computeNthFibonacci(nth - 2, counter);
CACHE.put(nth, result);
}
return result;
}
}

• localhost:8080/nthFibonacci/35
• localhost:8080/nthFibonacci/40
• localhost:8080/nthFibonacci/45

## 其他功能

• 与 Heap dump 类似，线程转储可以从VS Code中调用并显示在VisualVM中。
• 与CPU采样器类似，内存采样器会话可以在VS Code中配置和控制。
• VS Code现在也允许启动和停止项目进程的JFR会话，并在VisualVM中转储和显示收集的事件。

|
28天前
|

synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor

77 0
|
5天前
|

【C语言基础】：动态内存管理（含经典笔试题分析）-2
【C语言基础】：动态内存管理（含经典笔试题分析）
11 1
|
5天前
|

【C语言基础】：动态内存管理（含经典笔试题分析）-1
【C语言基础】：动态内存管理（含经典笔试题分析）
12 1
|
8天前
|

Linux编程：测试-高效内存复制与随机数生成的性能

40 2
|
21天前
|
Java

9 0
|
22天前
|
JSON 数据管理 测试技术

【5月更文挑战第28天】随着互联网技术的飞速发展，软件测试工作日益复杂化，传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势，为测试工程师提供高效测试解决方案的参考。
23 3
|
1月前
|

364 4
|
1月前
|
Go
LabVIEW性能和内存管理 8
LabVIEW性能和内存管理 8
21 0
|
1月前
|

LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配
LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配
14 0
|
1月前
|

LabVIEW性能和内存管理 6
LabVIEW性能和内存管理 6
15 0