我正试图为不受信任的java代码编写一个沙箱。
我使用java编写了沙箱。沙箱必须:
顺便说一下,当我在这里说内存时,它的意思是堆+非堆内存。
我发现,您可以设置内存阈值,如果内存池的之一超过了阈值,则通知您。但这不是我想要的,因为我想为堆+非堆内存设置限制。
我目前唯一的解决方案是轮询每一小毫秒,使用getHeapMemoryUsage()和getNonHeapMemoryUsage()从MemoryMXBean获得堆+非堆内存,并检查它是否超出了限制。
但我知道这个解决方案肯定也不好(而且有缺陷)。还有其他更好的解决办法吗?
发布于 2012-12-14 04:15:13
一个JVM在所有线程中都有一个共享堆。你不能“沙箱”记忆。如果希望管理每个应用程序的内存,则必须运行单独的进程。
现在,如果您想限制整体内存(堆+非堆),可以通过七度限调用系统函数南国防军 (如果您正在运行Linux),或者在运行超极限进程之前调用超极限。
要了解您的进程使用了多少内存,请从CommittedVirutalMemorySize属性获取ManagementFactory.getOperatingSystemMXBean()属性(但是没有一个getter )。
如果您希望收到即将关闭的通知,请使用“软限制”来表示“限制”/“超限”。您的进程将周期性地得到一个信号,它已经超过了软限制。如果设置了硬限制并超出了限制,则进程将被终止。
编辑:增加了关于获取内存大小和七进制信号的段落。
发布于 2012-12-30 04:42:47
我认为,如果没有深刻的魔力,这是不可能的:要么重写不受信任代码的字节码,要么修改底层JVM以跟踪内存使用情况。
作为一个实验,我实现了前者(重写字节码),以限制不受信任代码的内存分配(和指令消耗),使用-javaagent在加载时重写java类的字节码,并在每个内存分配之前插入检查。
这样,我们就可以调用一个函数,并将该函数(以及它调用的任何函数)限制为1024字节的内存分配和10000条指令,从而导致它在超调时抛出和异常。这类工作代码可在
https://github.com/lihaoyi/6858
医生:这太难了。这不是不可能的,但如果你有最后期限,你就不会尝试去做,而且如果你真的让它发挥作用,你很可能会发表一篇会议论文。
https://stackoverflow.com/questions/13872512
复制相似问题