Java守护程序线程是否与产生进程共享堆或Perm Gen?

时间:2012-09-12 13:46:09

标签: java multithreading heap daemon permgen

如果我从我的程序(非守护程序进程)创建一个守护进程线程,那么堆和perm gen内存空间是否与新线程共享还是重新分配?

如果守护程序线程有自己的空间,那么在新线程的创建中是否遵守了最大堆大小等JVM内存调整算法?

2 个答案:

答案 0 :(得分:8)

  

是与新线程共享的堆和perm gen内存空间还是重新分配?

所有线程(守护程序状态无关紧要)共享堆和perm内存空间。每个线程都有自己的堆栈空间,用于存储方法字段和调用堆栈。您可以按changing JVM arguments调整分配的每线程堆栈空间的大小。但即使这些堆栈区域也是一般JVM堆空间的一部分。

当线程在单独的CPU中运行时,它还具有内存缓存。出于性能原因使用每CPU内存高速缓存,因此可以出于速度原因对本地CPU内存进行更新,而无需在每次访问时将信息同步到中央存储。但是这些缓存仍然可以读取和写入通用JVM内存空间。

有关守护程序线程的真正含义的更多信息,请参阅@Peter's answer

答案 1 :(得分:3)

守护程序线程和普通线程之间唯一重要的区别是它是否会阻止进程停止。正常线程使JVM保持运行,守护程序不运行。

守护程序线程

  • 具有一个最大大小的相同堆。
  • 相同的perm gen,也有一个最大尺寸。
  • 相同的线程优先级。
  • 使用相同数量的内存。
  • 堆栈的最大大小相同。

BTW:其他差异是迂腐的,

  • isDaemon()将返回true
  • 守护程序默认会创建守护程序线程。
  • 将在线程转储中显示为守护程序。