为什么Java有这么大的足迹?

2022-09-03 07:27:01

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

我意识到,如果没有具体的应用程序和VM配置,这个问题可能并不简单,所以只是为了缩小范围:我主要对默认/典型的VM配置感兴趣,对基准控制台“Hello world”应用程序以及任何现实世界的桌面或服务器应用程序感兴趣(我怀疑JVM的很大一部分占用空间在很大程度上独立于应用程序本身, 理想情况下,我想放大这一部分。

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

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

  • 我在 intarwebs 的某个地方读到过,很大一部分占用空间仅仅是由于标准库的大小。如果是这样的话,那么为什么会预先加载这么多标准库呢?

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

  • 我敢肯定,在过去的十年左右的时间里,随着每个新版本的Java,它的足迹都有所不同。是否有任何特定的数字/图表精确记录了JVM的足迹变化了多少?


答案 1

一些举措:


答案 2

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

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

也就是说,有一个Jigsaw项目来模块化VM(我相信是库),它将在Java7中出现;这将帮助那些希望更小足迹的人。

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