我正在尝试量化执行相同进程的多线程与多进程的小型 Java 应用程序的内存占用差异。
我所有的测试都是在 Linux 下进行的。
运行多线程时,确定每个线程的总体占用空间和额外开销相对容易。运行单线程进程时,根据 pmap,JVM 占用空间很大(200-300M 虚拟空间)。如果我运行同一个应用程序的多个副本,我会看到内存占用 x N 并且没有任何 Java 代码在进程之间共享。
我被告知,由于 Java 代码是字节码,而不是可执行文件,因此它不会像使用 C 二进制文件那样在进程之间共享代码。但是,我随后被告知它可能会使用 Copy-On-Write 技术来实现相同的目标。如果我使用 pmap,它只会告诉我进程的占用空间,而不会指示可以与另一个进程共享多少。
所以问题是,我如何确定通过 Copy-On-Write 在进程之间共享多少数据?