16

Java - 或者至少是 Sun 的 Hotspot JVM - 长期以来一直以拥有非常大的内存占用而闻名。赋予它这种声誉的 JVM 到底是什么?我对详细的细分感兴趣:运行时有多少内存(JIT?GC/内存管理?类加载器?)任何与“辅助”API(如 JNI/JVMTI)相关的东西?标准库?(哪些部分得到多少?)任何其他主要组件?

我意识到如果没有具体的应用程序和 VM 配置,这可能无法直接回答,所以至少在某种程度上缩小范围:我主要对默认/典型 VM 配置和基线控制台“Hello world”应用程序感兴趣以及任何现实世界的桌面或服务器应用程序。(我怀疑 JVM 占用空间的很大一部分在很大程度上独立于应用程序本身,理想情况下,我想放大这部分。)

我还有其他几个密切相关的问题:

  • 其他类似的技术,例如 .NET/mono,没有表现出几乎相同的足迹。为什么会这样?

  • 我在 intarwebs 上的某处读到,很大一部分足迹仅仅是由于标准库的大小。如果是这种情况,那么为什么要预先加载这么多标准库呢?

  • 是否有任何努力(JSR,等等)来控制内存占用?我遇到的最接近的事情是一个减少 JVM 磁盘占用空间的项目。

  • 我敢肯定,在过去十年左右的时间里,每个新版本的 Java 的足迹都发生了变化。是否有任何具体的数字/图表准确记录了 JVM 的足迹发生了多少变化?

4

3 回答 3

7

一些举措:

  • 由于1.5类数据共享可以使用;
  • Java 6 更新 14 引入了压缩的 oops,从而减少了 64 位 JVM 的占用空间,堆内存不足 4GB。
于 2009-07-10T07:02:54.657 回答
5

我们有一些服务器端应用程序,它们除了桥接多播流量之外什么都不做(即它们没有永久状态)。它们都在 32 位 Java6 (linux) JRE 上运行大约2.3 - 2.5 Mb的堆。

这是一个很大的足迹吗?我可以在典型的服务器级机器上轻松拥有一千个这样的机器(从内存的角度来看),尽管从线程的角度来看这有点毫无意义!

也就是说,Jigsaw 项目将 Java7 中的 VM(我相信是库)模块化;这将帮助那些希望减少足迹的人。

我意识到这并不能真正回答您的问题,但它仍然是相关的!您在设计什么样的应用程序时发现内存占用是一个问题?

于 2009-07-10T06:34:22.967 回答
1

至少有一件事是 Java 的悠久历史——它始于 1995 年,现在是第 6 版。在添加功能的同时保持向后兼容性不可避免地会扩大其足迹。下图说明了很多...

JRE 大小从 Java 1.1 增加到 Java 6

于 2009-07-10T06:48:22.940 回答