Eclipse OpenJ9 中的类共享(8)一个示例
- UID
- 1066743
|
Eclipse OpenJ9 中的类共享(8)一个示例
一个示例为了实际演示类共享的好处,本节将提供一个简单的图形演示。相关源代码和二进制程序可以在GitHub 上找到。
这个演示应用程序将在 Java 8 上运行,查找 jre\lib 目录并打开每个 JAR,在它找到的每个类上调用 Class.forName()。这会导致将大约 16,000 个类加载到 JVM 中。该演示会报告 JVM 花了多长时间来加载这些类。这是一个有点不自然的示例,但它确实展示了类共享的好处。让我们来运行这个应用程序并看看结果。
类加载的性能- 从 项目下载或从 获取带 OpenJ9 的 JDK。
- 。
- 使用清单 11 中的命令,在不启用类共享的情况下多次运行该测试,以便对系统磁盘缓存进行“预热”:清单 11. 对磁盘缓存进行预热
1
| C:\OpenJ9>wa6480_openj9\j2sdk-image\bin\java -Xshareclasses:none -cp shcdemo.jar ClassLoadStress
|
当出现图 1 中的窗口时,请按下按钮。该应用程序将加载这些类。
图 1. 按下按钮加载类之后,应用程序会报告它加载了多少个类和所用的时间,如图 2 所示:
图 2. 结果出来了!您会注意到,应用程序每次运行时都可能会更快一点;这得益于操作系统优化。
- 现在,在启用类共享的情况下运行该演示,如清单 12 所示。这会创建一个新的共享缓存。您可以指定大约 50MB 的缓存大小,以确保拥有存储所有类的足够空间。清单 12 给出了命令行和一些样本输出。 清单 12. 在启用类共享的情况下运行演示
1
2
3
4
5
6
7
8
| C:\OpenJ9>wa6480_openj9\j2sdk-image\bin\java -cp shcdemo.jar -Xshareclasses:name=demo,verbose -Xscmx50m ClassLoadStress
[-Xshareclasses persistent cache enabled]
[-Xshareclasses verbose output enabled]
JVMSHRC236I Created shared classes persistent cache demo
JVMSHRC246I Attached shared classes persistent cache demo
JVMSHRC765I Memory page protection on runtime data, string read-write data and partially filled pages is successfully enabled
JVMSHRC168I Total shared class bytes read=1111375.Total bytes stored=40947096
JVMSHRC818I Total unstored bytes due to the setting of shared cache soft max is 0.Unstored AOT bytes due to the setting of -Xscmaxaot is 0.Unstored JIT bytes due to the setting of -Xscmaxjitdata is 0.
|
还可以使用 printStats 检查缓存统计数据,如清单 13 所示:
清单 13. 检查缓存类的数量1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| C:\OpenJ9>wa6480_openj9\j2sdk-image\bin\java -cp shcdemo.jar -Xshareclasses:name=demo,printStats
Current statistics for cache "demo":
Cache created with:
-Xnolinenumbers = false
BCI Enabled = true
Restrict Classpaths = false
Feature = cr
Cache contains only classes with line numbers
base address = 0x0000000011F96000
end address = 0x0000000015140000
allocation pointer = 0x000000001403FF50
cache size = 52428192
softmx bytes = 52428192
free bytes = 10874992
ROMClass bytes = 34250576
AOT bytes = 1193452
Reserved space for AOT bytes = -1
Maximum space for AOT bytes = -1
JIT data bytes = 28208
Reserved space for JIT data bytes = -1
Maximum space for JIT data bytes = -1
Zip cache bytes = 902472
Data bytes = 351648
Metadata bytes = 661212
Metadata % used = 1%
Class debug area size = 4165632
Class debug area used bytes = 3911176
Class debug area % used = 93%
# ROMClasses = 17062
# AOT Methods = 559
# Classpaths = 3
# URLs = 0
# Tokens = 0
# Zip caches = 5
# Stale classes = 0
% Stale classes = 0%
Cache is 79% full
Cache is accessible to current user = true
|
- 现在,使用相同 Java 命令行再次启动该演示。这一次,应该会从共享类缓存中读取这些类,参见下面的清单: 清单 14. 使用一个暖共享缓存来运行应用程序
1
2
3
4
5
6
7
8
| C:\OpenJ9>wa6480_openj9\j2sdk-image\bin\java -cp shcdemo.jar -Xshareclasses:name=demo,verbose -Xscmx50m ClassLoadStress
[-Xshareclasses persistent cache enabled]
[-Xshareclasses verbose output enabled]
JVMSHRC237I Opened shared classes persistent cache demo
JVMSHRC246I Attached shared classes persistent cache demo
JVMSHRC765I Memory page protection on runtime data, string read-write data and partially filled pages is successfully enabled
JVMSHRC168I Total shared class bytes read=36841382.Total bytes stored=50652
JVMSHRC818I Total unstored bytes due to the setting of shared cache soft max is 0.Unstored AOT bytes due to the setting of -Xscmaxaot is 0.Unstored JIT bytes due to the setting of -Xscmaxjitdata is 0.
|
可以清楚地看到类加载时间方面的显著改进(缩短了大约 40%)。同样地,由于操作系统优化,每次运行演示都应该看到略微的性能提升。
图 3. 暖缓存结果 您还可以试验许多不同的情况。例如,可以使用 javaw 命令启动多个演示,触发它们一起加载类,观察并发性能。
在真实场景中,通过使用类共享获得的 JVM 启动时间总减少量取决于应用程序加载的类的数量。HelloWorld 这样的程序可能不是很明显,但大型 Web 服务器肯定会获得较大的改进。无论如何,希望这个示例展示了对类共享进行试验是非常简单的,所以您可以轻松地测试受益程度。
|
|
|
|
|
|