1

如果我从我的程序(非守护进程)创建守护线程,堆和永久生成内存空间是与新线程共享还是重新分配?

如果守护线程有自己的空间,在创建新线程时是否尊重 JVM 内存调整参数(如最大堆大小等)?

4

2 回答 2

8

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

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

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

有关 daemon-thread 真正含义的更多信息,请参阅@Peter 的回答

于 2012-09-12T13:47:04.123 回答
3

守护线程和普通线程之间的唯一显着区别是它是否会阻止进程停止。普通线程保持 JVM 运行,而守护进程则不会。

守护线程有

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

顺便说一句:其他差异是迂腐的,

  • isDaemon() 将返回true
  • 默认情况下,守护进程将创建守护线程。
  • 将在线程转储中显示为守护进程。
于 2012-09-12T14:04:58.137 回答