我所做的java应用程序显然是在使用共享内存,这会干扰我客户端的unix环境中其他程序的部署。
从来没有使用任何共享内存的意图,我需要确定它的使用位置。
计划概述:
- 通用可执行jar,它将读取配置文件,执行unix命令行脚本并将输出的完整性发布到其他地方托管的REST服务。每小时重复一次(它监控环境的健康状况)
- jar有3个单独的实例同时运行,但是读取不同的配置文件。它们在任何时候都不共享任何文件,并且它们创建的日志文件是分开的。
- 所有BufferedReaders,InputStream等都会相应地打开和关闭。
启动程序后,通过在ipcs -a中对进程ID进行greping来检查它在共享内存中的存在,并列出它们。
熟悉IPC和java的人是否有任何警告标志? 我可以使用任何执行选项来阻止共享内存的使用吗?
干杯
编辑:
@Aaron - 没有错误,但是当其他程序部署在环境中时,他们会检查使用共享内存的进程。如果有进程,它将停止部署。必须有理由进行检查,但我不知道......答案 0 :(得分:1)
我可以想到几个可能的解释:
显然,如果使用-XX运行JVM:启用了UseLargePages,则JVM使用共享内存:请参阅Cannot create JVM with -XX:+UseLargePages enabled
如果两个JVM在同一个文件上打开MemoryMappedByteBuffer
,它们实际上是在使用共享内存:请参阅Java NIO - Memory mapped files
也可以编写使用shmat
等的JNI本机库来创建共享内存段。您的Java应用程序的第三方库之一可以在幕后执行此操作。
至于如何找到罪魁祸首,也许你应该尝试在java
下运行strace
。这篇博客文章告诉你如何:
然而,从原始痕迹到明确诊断可能并不容易。
当在环境中部署其他程序时,他们使用共享内存检查进程。如果有进程,它将停止部署。必须有理由进行检查,但我不知道......
这可以防止某些应用程序的许可证检查颠覆...或类似的东西。我倾向于与这些程序的提供者/供应商交谈,以找出他们的软件失败的原因。询问>>他们<<获得可接受的解决方法,使他们的代码与Java和/或Java appss共存。