防止使用共享内存
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 方库之一可能正在幕后执行此操作。
至于如何找到罪魁祸首,也许你应该尝试运行宁java
下strace
。此博客 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 应用程序共存。
我制作的一个 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 方库之一可能正在幕后执行此操作。
至于如何找到罪魁祸首,也许你应该尝试运行宁java
下strace
。此博客 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 应用程序共存。