有没有一种方法可以对Java中的每个线程设置最大内存使用限制?

有没有一种方法可以对Java中的每个线程设置最大内存使用限制?,java,multithreading,memory,Java,Multithreading,Memory,当我们在Java程序中启动线程时,有没有办法为每个线程分配内存限制 我的意思是,我们为一个新的Java进程分配如下内容: /usr/java/default/bin/java -Xms512m -Xmx1024m -jar /opt/abc/MyProcessor/MyProcessor.jar 我们可以用Java线程做类似的事情吗 基本上,我的每个线程都将执行一些任务,我希望对每个线程的内存使用量设置一些最大限制。要对每个线程设置限制,您需要在单独的进程中运行每个线程 线程共享内存,因此无法

当我们在
Java
程序中启动线程时,有没有办法为每个线程分配内存限制

我的意思是,我们为一个新的
Java
进程分配如下内容:

/usr/java/default/bin/java -Xms512m -Xmx1024m -jar /opt/abc/MyProcessor/MyProcessor.jar
我们可以用Java线程做类似的事情吗


基本上,我的每个线程都将执行一些任务,我希望对每个线程的内存使用量设置一些最大限制。

要对每个线程设置限制,您需要在单独的进程中运行每个线程


线程共享内存,因此无法自动将内存分配给特定线程。但是,您可以自己在代码中进行计算(针对每个感兴趣的数据类型),并管理每个线程使用的内存量。

您可以使用
-Xss
增加线程堆栈大小。它将适用于每个线程。堆是共享的,所以您不能单独更改线程的堆。

总之,不是

没有堆内存由特定线程“拥有”的概念

但是,您可以调整最大堆栈大小(每个线程都有自己的堆栈),但我怀疑这是您想要的

我们可以用Java线程做类似的事情吗

不可以。进程中的线程通常用于访问进程中的共享主内存(本例中为JVM)

基本上,我的每个线程都将执行一些任务,我希望对每个线程的内存使用量设置一些最大限制

您可以:

  • 简单的方法。生成新的JVM进程,您可以在每个进程上指定堆大小
  • 艰难的道路(我不推荐;这是一个可用的选项)。您可以估计在每个线程中创建的对象的大小,如果线程创建的对象的大小超过一定数量,则停止线程的进一步执行。这将要求您封装
    new
    关键字。简单地说,所有对象都必须从工厂实例化,工厂将记录大致的内存使用情况。请记住,堆上的对象大小是近似值;Java没有
    sizeof
    运算符。如果需要对堆栈上的对象计数,那么使用启动时传递给JVM的
    -Xss
    标志就很容易做到

您能否提供任务的更多详细信息?线程使用的特定类是否特别大/麻烦?@Martin James:不,没有这样的特定类。问题是,每个线程都监视一个目录,每当目录中有文件时,它就会拾取并处理它。现在,如果其中有许多文件,它将尝试同时处理其中的许多文件,这可能会消耗太多内存。因为您使用的任何第三方库(包括标准Java库)都会从该库的其他位置或标准Java库中分配对象本身,第二个选项最终将是一个非常粗糙的近似值。