Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 设置JNI和子进程内存限制_Java_Java Native Interface - Fatal编程技术网

Java 设置JNI和子进程内存限制

Java 设置JNI和子进程内存限制,java,java-native-interface,Java,Java Native Interface,我有一个使用本机库的Java进程。本机库的资源非常繁重,需要花费大量ram。此外,对于某些极端情况,它将完全占用我所有的内存,并完全冻结我的系统 如果应用程序在这些奇怪的情况下崩溃就好了。但如果可以抛出异常,那就更好了。有没有一种方法可以为调用这个JNI库和执行子进程指定内存限制 我曾尝试在linux下使用ulimit-v,但没有成功。理想情况下,我想要一个更具可移植性的解决方案,因为该程序还必须在其他平台上运行。当然没有可移植的解决方案。限制当前进程和子进程的资源使用只能由操作系统完成。这使得

我有一个使用本机库的Java进程。本机库的资源非常繁重,需要花费大量ram。此外,对于某些极端情况,它将完全占用我所有的内存,并完全冻结我的系统

如果应用程序在这些奇怪的情况下崩溃就好了。但如果可以抛出异常,那就更好了。有没有一种方法可以为调用这个JNI库和执行子进程指定内存限制


我曾尝试在linux下使用ulimit-v,但没有成功。理想情况下,我想要一个更具可移植性的解决方案,因为该程序还必须在其他平台上运行。

当然没有可移植的解决方案。限制当前进程和子进程的资源使用只能由操作系统完成。这使得它必须是特定于平台且不可移植的

你试过ulimit,但那对你不起作用。(我想这是因为每个进程都有限制)另一种选择是Linux控制组(cgroups)


无论哪种方式,
ulimit
cgroup
都是不可移植的,您可以在JVM之外设置或管理它们。

JNI库加载到JVM进程中,因此您不能仅对JNI部分应用特殊的内存限制。只有创建第二个进程才允许这样做,但这需要在主Java进程和记录JNI部分的第二个进程之间进行进程间通信

然而,限制内存使用是操作系统的工作,因此没有独立于平台的解决方案


我认为解决这个问题的唯一干净方法是修改库源代码(希望我们谈论的是开源库?),或者以限制内存使用的方式配置使用过的库(如果它支持的话)。

我知道没有真正的解决方案。充其量,如果您对该库的功能了解得足够多,您可以以某种方式干预它的内存使用情况,并将故障返回给它的
malloc()
调用,例如,但从您对其行为的描述来看,该库不太可能很好地处理此类故障返回,从而导致崩溃或数据损坏。便携式跨平台解决方案将更加困难。IMO插入带有LD_预加载或DLL注入的JVM一开始就是玩火和汽油。行为不端的第三方库添加反物质。限制当前进程和子进程中的资源使用只能由操作系统完成。这也是全过程的。我不知道通过链接到进程的库来限制资源使用的任何方法。我的意思是“通过当前进程…”。没有一种方法可以限制本机库在进程中可以做什么。这不是一种简单的方法。正如我在上面的评论中提到的,可以插入内存管理函数,如
malloc()
,确定调用的来源,并以这种方式限制库的内存使用。不过,这是一种可怕的黑客行为,而介入Java进程一开始就充满了危险。如果插入的
malloc()
在达到指定限制时返回
NULL
,则该库的行为良好。。。但我想说的是,你(实际上)正在改变这个库,使它限制自己。而且,正如您所指出的,即使您可以安全地替换本机代码使用的malloc库(而不会破坏其他东西),那么最有可能的结果将是本机库出现错误行为。很有可能会使JVM硬崩溃。