【问题标题】:Why does Java have such a large footprint?为什么Java有这么大的足迹?
【发布时间】: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 的尺寸有多大吗??

标签: java memory footprint


【解决方案1】:

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

【讨论】:

  • 我想你可能会觉得这有点误导。
  • 假设运行时间在 12 年内增加了 7 倍。同时,PC 的平均 RAM 从约 100Mb 上升到约 2Gb; 20 倍。这意味着实际上 JDK 缩小了 3 倍。
  • 如果您查看英文下载包的大小,您可能会看到不同的图片。与其说是保留功能使它变大,不如说是添加新功能。
  • 也许它相对缩小了,但与 .NET(或 Mono)运行时相比,它仍然很大——无论是绝对还是相对,无论你喜欢哪个。
  • 我认为与 .NET 的大部分区别在于 .NET 作为操作系统的一部分出现。
【解决方案2】:

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

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

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

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

【讨论】:

  • 好吧,我现在有一个 Java 应用程序 (NetBeans) 正在运行,而 java.exe 目前使用 230 MB 内存。我不会称其为小足迹。
  • 这与 Java 的足迹 无关,而与 NetBeans 应用程序有关!我的 IntelliJ IDEA 经常使用 700+ Mb 的堆 - 那是因为我打开了多个项目,并且它已经在内存中索引 everything 以提高速度
  • 恕我直言,这种 IDE 的 230 MB 很小。反正现在内存很便宜。
  • 作为比较,我打开了超过 15 个标签的谷歌浏览器,它占用的空间不到 50 MB。 Java 应用程序经常使用比其本地应用程序更多的内存。在实践中是否重要,是一个不同的问题。
  • 我打开了带有 12 个标签的 Chrome,它使用 >250Mb。我确信这与我正在访问的网站有很大关系(pfffft):Java 应用程序也是如此。如果它们在内部缓存大量数据,那么它们会更大。这与 VM 占用空间无关
【解决方案3】:

一些举措:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2013-12-21
    • 2013-05-15
    相关资源
    最近更新 更多