有没有办法在Java中为每个线程设置最大内存使用限制?

时间:2011-07-06 16:39:50

标签: java multithreading memory

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

我的意思是我们为新的Java进程分配这样的内容:

/usr/java/default/bin/java -Xms512m -Xmx1024m -jar /opt/abc/MyProcessor/MyProcessor.jar

我们有什么方法可以用Java线程做类似的事情吗?

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

4 个答案:

答案 0 :(得分:4)

  

我们有什么方法可以用Java线程做类似的事情吗?

没有。进程中的线程通常用于访问进程内的共享主内存(在本例中为JVM)。

  

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

你要么:

  • 简单的方法。产生新的JVM进程,您可以在其中指定每个进程的堆大小。
  • 困难的方式(我不推荐;这是一个可用的选项)。您可以近似在每个线程中创建的对象的大小,并且如果线程创建的对象的大小超过特定量,则停止进一步执行线程。这将要求您封装new关键字。简而言之,所有对象都必须从工厂实例化,这些工具将保留近似内存使用情况的选项卡。请记住,堆上的对象大小是近似值; Java没有sizeof运算符。如果需要在堆栈上保留对象的数量,那么使用在启动时传递给JVM的-Xss标志很容易实现。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

总之,没有。

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

然而,你可以调整最大堆栈大小(每个线程都有自己的堆栈),但我怀疑这是你所追求的。