防止使用共享内存

Preventing use of shared memory

我制作的一个 java 应用程序显然正在使用共享内存,这会干扰我客户端 unix 环境中其他程序的部署。

从来没有打算使用任何共享内存,我需要确定它在哪里被消耗。


计划概览:

- 通用可执行 jar,它将读取配置文件,执行 unix 命令行脚本并将输出的完整性发布到别处托管的 REST 服务。每小时重复一次(它监视环境的健康状况)

-同时有 3 个单独的 jar 运行 实例,但读取不同的配置文件。他们绝不会共享任何文件,并且他们创建的日志文件是单独的。

-所有 BufferedReader、InputStreams 等都已正确打开和关闭。


启动程序后,通过在 ipcs -a 中 greping 它们的进程 ID 来检查它在共享内存中的存在,它们都在其中列出。

熟悉 IPC 和 java 的人是否有任何警告信号? 我可以使用任何执行选项来防止使用共享内存吗?

干杯

编辑:

@Aaron - 没有错误,但是当其他程序部署到环境中时,它们会检查使用共享内存的进程。如果有进程,它将停止部署。那张支票一定是有原因的,但我不知道...

我能想到几个可能的解释:

  • 显然,如果您 运行 启用了 -XX:UseLargePages 的 JVM,则 JVM 使用共享内存:请参阅 Cannot create JVM with -XX:+UseLargePages enabled

  • 如果两个 JVM 在同一个文件上打开 MemoryMappedByteBuffer,它们实际上是在使用共享内存:参见 Java NIO - Memory mapped files

  • 也可以编写使用shmat等的JNI原生库来创建共享内存段。您的 Java 应用程序的第 3 方库之一可能正在幕后执行此操作。


至于如何找到罪魁祸首,也许你应该尝试运行宁javastrace。此博客 post 告诉您如何:

然而,从原始痕迹到明确诊断可能并不容易。


When the other programs are deployed on the environment they check for processes using shared memory. If there is a process, it will halt the deployment. There must be a reason for that check, but I don't know it...

这可能是为了防止颠覆某些应用程序的许可证检查......或类似的东西。我倾向于与这些程序的提供商/供应商交谈,以找出他们的软件失败的原因。询问 >>他们<< 一个可接受的解决方法,让他们的代码与 Java and/or 您的 Java 应用程序共存。