Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Runtime.getRuntime().exec()调用的进程内存分配能力有限?_Java_Memory_Process_Desktop Application - Fatal编程技术网

Java 为什么Runtime.getRuntime().exec()调用的进程内存分配能力有限?

Java 为什么Runtime.getRuntime().exec()调用的进程内存分配能力有限?,java,memory,process,desktop-application,Java,Memory,Process,Desktop Application,在Java 8应用程序中,我通过调用以下命令创建新流程: Process applicationProcess = Runtime.getRuntime.exec(executionCommand); 如果在Windows 7 64位+Java 8 64位(8GB RAM)上执行,我的executionCommand包含*.exe应用程序路径(基本上是一个带有*.exe启动器和预定义的-Xmx 4096m和-Xms 2048m虚拟机选项的Java应用程序) 调用的.exeapplication

在Java 8应用程序中,我通过调用以下命令创建新流程:

Process applicationProcess = Runtime.getRuntime.exec(executionCommand);
如果在Windows 7 64位+Java 8 64位(8GB RAM)上执行,我的
executionCommand
包含*.exe应用程序路径(基本上是一个带有*.exe启动器和预定义的-Xmx 4096m和-Xms 2048m虚拟机选项的Java应用程序)

调用的.exe
applicationProcess
会立即创建额外的进程“B”,并关闭
process applicationProcess
,因此我从Java应用程序内部去掉了对进程“B”的任何引用

当我的应用程序运行时,上面的命令调用的进程“B”以某种方式将内存分配限制在~800MB。 这削弱了这个过程,所以它不能正常工作

若我关闭我的应用程序(当被调用的进程仍在运行时),突然被调用的进程“B”开始根据其预定义的VM选项分配额外内存,并重新获得适当的完全效率

显然,我的应用程序以某种方式限制了被调用进程“B”的内存分配能力。 为什么会发生这种情况?我如何绕过这种限制?

注:
1.为我的java应用程序(invocator)设置更高的-Xmx和-Xms值并不能解决这个问题。

如果您的观察是正确的,那么我只能想象它与虚拟内存地址空间或作业限制有关。但我不确定。你怎么看内存分配是有限的?它在OOM中失败了吗?您的意思是虚拟机确实启动,但没有2GB堆吗?还是说住户人数有限?我认为这是正常的,只要它不被触碰。正常情况下,这个进程“B”分配大约1000-1200MB的RAM,以便正常运行(内存分配与大量CPU消耗相结合-大约占i7上总CPU消耗的50%)。如果此进程分配的内存不足,其CPU消耗将降至0%并冻结。不幸的是,它是一个第三方应用程序,不创建任何工作日志,所以我无法检查它的状态。在我的java应用程序关闭后,进程“B”分配了800MB以上的额外内存,重新获得了高CPU负载并完成了任务。我必须承认,如果我从Netbeans 8.2启动java应用程序,进程“B”分配了足够的内存,一切正常工作。听起来你的机器没有足够的RAM,所以,当内存中有两个JVM时,会有压力使很多页面被调出。这也解释了糟糕的表现。因此,这不是父母/子女的问题。我无法想象一个JVM在没有至少分配Xms的情况下运行,如果不能的话,也不能终止OOM。我恐怕这不是重点。1.从Netbeans启动不会导致任何问题2。我已经成功地通过(伪代码)启动了进程“B”:
Runtime.getRuntime().exec(“cmd-C start/wait xxxxxx”)