【发布时间】:2010-11-09 15:06:02
【问题描述】:
Java——或者至少是 Sun 的 Hotspot JVM——长期以来一直以占用大量内存而闻名。赋予它这种声誉的 JVM 到底是什么?我对详细的细分感兴趣:运行时有多少内存(JIT?GC/内存管理?类加载器?)任何与“辅助”API(如 JNI/JVMTI)相关的东西?标准库? (哪些部分得到多少?)还有其他主要组成部分吗?
我意识到,如果没有具体的应用程序和虚拟机配置,这可能无法直接回答,所以至少在某种程度上缩小范围:我主要对默认/典型虚拟机配置感兴趣,并且在基线控制台“你好世界”应用程序以及任何现实世界的桌面或服务器应用程序。 (我怀疑 JVM 占用空间的很大一部分很大程度上独立于应用程序本身,理想情况下,我想放大这部分。)
我还有其他几个密切相关的问题:
其他类似的技术,例如 .NET/mono,不会表现出几乎相同的占用空间。为什么会这样?
我在 intarwebs 上的某处读到,很大一部分占用空间仅仅是由于标准库的大小。如果是这样,那为什么要预先加载这么多标准库?
是否有任何努力(JSR,等等)来控制内存占用?我遇到的最接近的是reduce the on-disk footprint of the JVM 的一个项目。
我确信在过去十年左右的时间里,每个新版本的 Java 的足迹都发生了变化。是否有任何具体的数字/图表准确记录了 JVM 的足迹发生了多少变化?
【问题讨论】:
-
您应该将链接发布到您从中获取信息的任何地方,HotSpot 虚拟机“......长期以来一直以拥有非常大的内存占用而闻名”。
-
那个“声望”其实不过是 Java 1.1 和 Java 还年轻的 1.2 时代的遗产。
-
我认为这不完全公平 - 从那时起,Java 肯定没有变得更小,我们通常只有 很多 更多的 RAM 可以使用。显然,运行时的大小正在伤害一些人,否则 Jigsaw 项目可能不存在。
-
我有点怀疑,所以我尝试在 Linux 上运行 Java 和 C# 中的“HelloWorld”(在单声道上运行),只是为了了解基本足迹。对于 Java,(VSZ, RSS) = (261468, 9412),对于 C#+mono = (15536, 4840)。 Java 虚拟集的大小超过了一个数量级,这让我感到惊讶。
-
你在乎 VSZ 的尺寸有多大吗??