我正在尝试量化执行相同进程的多线程与多进程的小型 Java 应用程序的内存占用差异。
我所有的测试都是在 Linux 下进行的。
运行多线程时,确定每个线程的总体占用空间和额外开销相对容易。根据 pmap,运行单线程进程时,JVM 占用空间大(200-300M 虚拟空间)。如果我运行同一个应用程序的多个副本,我会看到内存占用 x N,并且没有任何 Java 代码在进程之间共享。
我被告知,由于 Java 代码是字节码,不可执行,因此它不会像 C 二进制文件那样在进程之间共享代码。然而,后来我得知它可能会使用 Copy-On-Write 技术来实现同样的事情。如果我使用 pmap,它只会告诉我该进程的足迹,而不会指示可以与另一个进程共享多少。
所以问题是,我如何确定进程之间通过写时复制共享了多少数据?
最佳答案
在正确配置的非嵌入式 Linux 系统上,您为什么要关心内存占用?
如果您有答案,会有什么不同?
只有当一个进程是另一个进程的真正祖先时,数据才会在进程之间共享。
还要看java程序的内存布局和页面内的数据。所有这些都可能因版本而异。
关于linux - 如何确定 Linux 上多进程的 JVM 内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1328989/