Java - 或者至少是 Sun 的 Hotspot JVM - 长期以来一直以拥有非常大的内存占用而闻名。赋予它这种声誉的 JVM 到底是什么?我对详细的细分感兴趣:运行时有多少内存(JIT?GC/内存管理?类加载器?)任何与“辅助”API(如 JNI/JVMTI)相关的东西?标准库?(哪些部分得到多少?)任何其他主要组件?
我意识到如果没有具体的应用程序和 VM 配置,这可能无法直接回答,所以至少在某种程度上缩小范围:我主要对默认/典型 VM 配置和基线控制台“Hello world”应用程序感兴趣以及任何现实世界的桌面或服务器应用程序。(我怀疑 JVM 占用空间的很大一部分在很大程度上独立于应用程序本身,理想情况下,我想放大这部分。)
我还有其他几个密切相关的问题:
其他类似的技术,例如 .NET/mono,没有表现出几乎相同的足迹。为什么会这样?
我在 intarwebs 上的某处读到,很大一部分足迹仅仅是由于标准库的大小。如果是这种情况,那么为什么要预先加载这么多标准库呢?
是否有任何努力(JSR,等等)来控制内存占用?我遇到的最接近的事情是一个减少 JVM 磁盘占用空间的项目。
我敢肯定,在过去十年左右的时间里,每个新版本的 Java 的足迹都发生了变化。是否有任何具体的数字/图表准确记录了 JVM 的足迹发生了多少变化?