首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内存使用沙箱

Java内存使用沙箱
EN

Stack Overflow用户
提问于 2012-12-14 04:11:05
回答 2查看 1K关注 0票数 1

我正试图为不受信任的java代码编写一个沙箱。

我使用java编写了沙箱。沙箱必须:

  1. 限制不可信代码的内存使用。如果不受信任的代码使用的内存超过指定的限制,沙箱应该终止程序。
  2. 如果不受信任的代码不超过指定的限制,沙箱还应该能够确定所使用的“最大内存峰值”。

顺便说一下,当我在这里说内存时,它的意思是堆+非堆内存。

我发现,您可以设置内存阈值,如果内存池的之一超过了阈值,则通知您。但这不是我想要的,因为我想为堆+非堆内存设置限制。

我目前唯一的解决方案是轮询每一小毫秒,使用getHeapMemoryUsage()和getNonHeapMemoryUsage()从MemoryMXBean获得堆+非堆内存,并检查它是否超出了限制。

但我知道这个解决方案肯定也不好(而且有缺陷)。还有其他更好的解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2012-12-14 04:15:13

一个JVM在所有线程中都有一个共享堆。你不能“沙箱”记忆。如果希望管理每个应用程序的内存,则必须运行单独的进程。

现在,如果您想限制整体内存(堆+非堆),可以通过七度限调用系统函数南国防军 (如果您正在运行Linux),或者在运行超极限进程之前调用超极限

要了解您的进程使用了多少内存,请从CommittedVirutalMemorySize属性获取ManagementFactory.getOperatingSystemMXBean()属性(但是没有一个getter )。

如果您希望收到即将关闭的通知,请使用“软限制”来表示“限制”/“超限”。您的进程将周期性地得到一个信号,它已经超过了软限制。如果设置了硬限制并超出了限制,则进程将被终止。

编辑:增加了关于获取内存大小和七进制信号的段落。

票数 5
EN

Stack Overflow用户

发布于 2012-12-30 04:42:47

我认为,如果没有深刻的魔力,这是不可能的:要么重写不受信任代码的字节码,要么修改底层JVM以跟踪内存使用情况。

作为一个实验,我实现了前者(重写字节码),以限制不受信任代码的内存分配(和指令消耗),使用-javaagent在加载时重写java类的字节码,并在每个内存分配之前插入检查。

这样,我们就可以调用一个函数,并将该函数(以及它调用的任何函数)限制为1024字节的内存分配和10000条指令,从而导致它在超调时抛出和异常。这类工作代码可在

https://github.com/lihaoyi/6858

医生:这太难了。这不是不可能的,但如果你有最后期限,你就不会尝试去做,而且如果你真的让它发挥作用,你很可能会发表一篇会议论文。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13872512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档