Ted*_*ddy 1 java memory-management sandbox
我正在尝试为不受信任的Java代码编写沙箱.
我用java编写了沙盒.沙箱需要:
- 限制不可信代码的内存使用量.如果不受信任的代码使用的内存超过指定的限制,则沙箱应终止该程序.
- 如果不受信任的代码未超过指定的限制,则沙箱也应该能够确定使用的"最大内存峰值".
顺便说一句,当我在这里说内存时,它意味着堆+非堆内存.
我发现,你可以设置内存阈值和通知,如果一个内存池超过阈值.但这不是我想要的,因为我想设置Heap + Non-Heap内存的限制.
我现在有唯一的解决办法是调查每个小毫秒,获得堆+使用getHeapMemoryUsage()getNonHeapMemoryUsage()从非堆内存和MemoryMXBean,并检查它是否超出了限制.
但我知道这个解决方案肯定也不好(并且有缺陷).还有其他更好的解决方案吗?
单个JVM在所有线程中都有一个共享堆.你不能"沙箱"记忆.如果您希望管理每个应用程序的内存,则必须运行单独的进程.
现在,如果要限制总内存(堆+非堆),可以通过JNA调用系统函数setrlimit(如果您运行的是Linux),或者可以在运行Java进程之前调用ulimit.
要了解您的进程使用多少内存,请从ManagementFactory.getOperatingSystemMXBean()获取CommittedVirutalMemorySize属性(但它没有getter).
如果您希望收到即将关闭的通知,请使用setrlimit/ulimit的软限制.你的程序将定期得到一个信号,它已经超过了软极限.如果设置了硬限制且超出限制,则该过程将被终止.
编辑:添加了关于获取内存大小和setrlimit信号的段落.
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |