VisualVM【官网】很难下载,懂得都懂 😢,简单叙述一下下载的过程:
- 使用PC各种浏览器失败【❌】
- 使用Android手机多个浏览器失败【❌】
- 使用IOS手机多个浏览器,仅有Safari浏览器成功【🆗】
大家可以体会一下😃 当然,如果不想安装,可以直接在已安装的JDK目录下的bin内找到jvisualvm.exe
而且是汉化版本的。网盘地址,有需要的小伙伴儿可以进行下载。
链接:https://pan.baidu.com/s/1PC6iewD8GvmD898spKT0tw
提取码:gow5
1.Visual VM 简介
来自官网的介绍:
简单翻译:
All-in-One Java 故障诊断工具: VisualVM 是一个集成命令行 JDK 工具和轻量级概要分析功能的可视化工具。设计用于开发和生产时使用。
对比一下JDK自带版本和下载的最新版本区别:
总结一下区别:
- JDK自带版本为汉化版本
- 安装的插件版本不同
- UI新版本稍好(JDK8可是6年前的东西了)
2. Visual GC 使用
2.1 插件安装
需要注意的是有可能安装失败,失败不可怕,重试几次就行了,具体安装过程这里不再赘述。插件安装步骤如下:
2.2 插件使用
安装后即可使用,部分工具需要进行配置,Visual GC 界面如下:
3.测试
项目中有一个这么一段代码new HashMap<>(2000000)
大家知道 HashMap 最好是进行初始容量的设置,不设置则初始容量为static final int DEFAULT_INITIAL_CAPACITY = 1 << 4
但是这个设置大小到底有没有实质上的影响呢?
3.1 代码
public class TestHashMapInitialCapacity { public static void main(String[] args) throws Exception { // 5s的倒计时是为了有时间打开 Visual GC 界面 int sleepTime = 5; for (int i = sleepTime; i > 0; i--) { Thread.sleep(1000); System.out.println("CountDown:" + i); } HashMap<String, String> map = new HashMap<>(2000000); int itemSize = 128; String str = "HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld!"; for (int i = 1; i <= itemSize; i++) { Thread.sleep(100); map.put(str + i, str + i); System.out.println("i = " + i + ", map size = " + map.size() + ", map capacity = " + tableLength(map)); } } /** * 用于查询 HashMap 实例对象的容量 * * @param hashMap HashMap实例对象 * @return 容量 * @throws Exception 可能的异常 */ private static int tableLength(HashMap<?, ?> hashMap) throws Exception { Field table = HashMap.class.getDeclaredField("table"); table.setAccessible(true); Object[] obj = (Object[]) table.get(hashMap); return obj.length; } }
3.2 过程
初始容量从2->20000->200000000
实际初始容量为2
(21),32768
(215),268435456
(228)。
2
新生代的使用空间19.890M
20000
新生代的使用空间21.171M
200000000
新生代的使用空间21.810M
老年代的使用空间为1.000G
(10000000
为512M
)
3.2 总结
通过以上测试可以说明以下实时:
- HashMap对象是在put第一个元素时进行初始化的
- 初始化容量时会分配空间
- 为了消除存储字符串的影响初始化后仅放入一个对象的空间为(
18.608M->18.609M->18.583M+1G
)
4.总结
工具很有针对性,具体使用还是要进行一定的学习,有很多插件可以使用,功能强大。