在一个大型 Java 桌面应用程序中,我是一名开发人员,我注意到,当您刚刚启动该程序时,大多数 GUI 功能和操作在您第一次激活它们时会有一点延迟。再次单击相同的功能,它会立即生效。我目前的假设是以下一个或多个运行时操作会导致这种效果(据我所知,大致按从最可能到最不可能的顺序):
- 从磁盘加载 .class 文件(或从 JAR 中解压缩它们)
- 类字节码验证
- 字节码的JIT编译
- 类静态初始化
如果该程序对所有内容都具有可爱的活泼感觉,而不仅仅是您已经至少单击过一次的按钮,那显然会更好。所以,我的问题是:
- 我如何判断这些操作中的哪一个(或者可能是我没有想到的其他一些操作)是主要影响因素?我知道如何使用 VisualVM 进行 CPU 和堆分析,但我不知道如何分析像这样的半隐藏 JVM 因素。
- 假设上述操作是造成这种延迟的原因,减少它的一种方法可能是让低优先级的后台线程运行程序中的所有类和最常用的库,并反射性地触摸它们以强制它们被类加载和初始化。理想情况下,它会首先接触常用的类,然后将不常用的类放到该过程的后期。这是一个好主意吗?
- 如果是这样,是否有人已经写过这样做的东西?
- 如果没有,实现它的最简单方法是什么?