Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 今天,在JVM中,最接近真实(资源受限)隔离的是什么?_Java_Jvm_Distributed_Bytecode - Fatal编程技术网

Java 今天,在JVM中,最接近真实(资源受限)隔离的是什么?

Java 今天,在JVM中,最接近真实(资源受限)隔离的是什么?,java,jvm,distributed,bytecode,Java,Jvm,Distributed,Bytecode,假设以下情况: 您有一个支持多个用户的大型复杂系统(分布式、并发、大型数据集)。代码被发送到数据 您希望允许系统中的移动代码(即将在与系统其余部分相同的JVM中运行的不受信任的代码)利用数据的局部性,避免反序列化等 您可以将代码放在一个有趣的类加载器中,并像applet运行程序一样使用自定义的安全策略。但仍存在一些问题: 系统作为一个整体应该受到保护,免受恶意代码的侵害——例如,产生大量线程,耗尽所有cpu,分配过多内存 在新千年伊始,有争议的想法是JSR-121。隔离意味着带来进程隔离的大

假设以下情况:

  • 您有一个支持多个用户的大型复杂系统(分布式、并发、大型数据集)。代码被发送到数据
  • 您希望允许系统中的移动代码(即将在与系统其余部分相同的JVM中运行的不受信任的代码)利用数据的局部性,避免反序列化等
您可以将代码放在一个有趣的类加载器中,并像applet运行程序一样使用自定义的安全策略。但仍存在一些问题:

系统作为一个整体应该受到保护,免受恶意代码的侵害——例如,产生大量线程,耗尽所有cpu,分配过多内存

在新千年伊始,有争议的想法是JSR-121。隔离意味着带来进程隔离的大部分好处——限制cpu使用、线程生成、堆使用:一般来说是资源分配

鉴于这一努力似乎已被太阳放弃,我们目前能得到的最接近的结果是什么

到目前为止,我的想法是:

  • 字节码将代码转换为插入分配跟踪。谷歌似乎做了类似的事情:。这需要一点工作,因为谷歌(约书亚)已经把自己逼到了一个角落,把所有的东西都包成了私有的
  • 还禁止调用安全管理器不能调用的东西,例如线程创建
  • 在循环和递归函数中插入(罕见的)中断检查,以便监视线程可以监视(使用ThreadMXBean),如果需要的时间太长,则中断有问题的线程。对可重入性进行限制可能更简单——在对用户代码的任何调用中,一个基本块在中止之前只能输入n次

有没有更好的或现有的方法来做到这一点

这是一个复杂的问题。我的第一个想法是创建一种特定于领域的语言,满足“移动”用户的需求。DSL将无法执行危险操作


谁是上传不可信代码的人?这听起来像是一个可疑的想法开始。我们花了大量精力确保人们不能运行不受信任的代码;-)

问题在于,隔离进程的唯一真正方法是使用专用机器/硬件。无论你做什么,你都必须做出妥协。这取决于这些折衷是可以接受的,取决于与代码共享JVM是否是一种实践


对于一般情况,这不是一个可以用简单的方式解决的问题,因为您希望防止您没有想到的事情(有一天其他人可能会想到)

我现在能想到的最好方法是将每个用户放入自己的JVM中,该JVM具有较低的XMX,并且受到CPU操作系统的限制。随着用户数量的增长,效率非常低,但是像这样编码的想法让我感到难以置信。到目前为止,有什么好运气吗?你会更新吗?谢谢我也一直在寻找这个,这就是我得到的DSL是一个巨大的蠕虫罐头。如果是内部的,你无论如何都有这些问题。如果是外部的,你必须设计语言——语言设计比字节码操作要困难得多!还实现了一个足够好的字节码转换,让hotspot真正工作。不管怎样,设计一个“不会”导致资源泄漏的dsl是解决问题的关键。这一部分必须是运行时的。因此,我更愿意使用人们知道的现有语言,并使用合适的工具,因为dsl基本上解决不了任何实际问题。至于令人怀疑的想法jibe,你认为安全管理器的意义到底是什么?对于运行不受信任的代码,这是一个有点不令人满意的答案,基本上是一个来自个人怀疑的论点。我认为你需要重新阅读这个问题,找到这个方法不起作用的真正原因。。。如果您的投诉有效,将证明类型系统、内存保护、基于功能的安全性和所有其他保护机制都不起作用。这些系统中没有一个能够防止出现作者没有想到的错误。Tbh,这种东西甚至都不是新的——自七十年代以来,DBMS一直是资源约束查询。这里没有什么神奇的事情发生。是的,有一些技术可以最大限度地减少行为良好的系统之间的影响。然而,为了防止“恶意代码”,您需要一个单独的系统。例如,我可以用java编写一个简单的程序,将数据写入磁盘,使系统崩溃。即使是ssh或smtp也会认为系统速度异常缓慢。您可以使用安全管理器来防止此操作和许多其他操作,直到恶意代码无法实际执行任何操作,否则它将不会产生任何影响。基本上,对于恶意代码,你允许它做的任何事情都可以用来对付你。一个简单的减慢机器速度的方法是无休止地创建对象并触发大量GCs。线程的总内存不需要很大,但会显著降低JVM的速度。假设您禁用了所有对象创建(使代码变得非常不可用),恶意代码仍然可以调用File.length()之类的方法,该方法在JNI调用中创建对象,并可以生成400 MB/s的垃圾,调用频率足够高。注意:这种活动不仅会降低JVM的速度,还会对整个机器的性能产生明显的影响。真正的答案是使用技术手段保护自己不受意外或自满编程的影响,我同意@rjw是相当容易做到的,并且很容易理解,并且具有法律或合同保护,防止恶意编程代码。(同样是惯例)