空Runnable class需要多少内存?
How much memory takes empty Runnable class?
我在谷歌上搜索,但没有找到适合我的问题的答案:
空Runnable占用多少内存class?
我要求它是因为我不知道在某些情况下什么更好 - 创建我自己的 sheduler,里面有一个 runnable,它将每隔 X 次执行一次,直到应用程序关闭,或者每次我想要时初始化新的 Runnable做一些不在主线程中的事情并直接将代码放入其中。
实现 Runnable
的 class 实例的最小大小为 8 字节。 (这是在 32 位或 64 位 JVM 上没有字段的对象的大小。)实际大小将取决于具体实现。
It is not that simple as you think. Runnable extends Thread
and thread may take a lot of memory just by initialization.
你的推理不正确。
一个Thread
实例需要很多space,因为它有一个线程堆栈,而不是因为它实现了Runnable
。此外,线程堆栈的 space 未在线程初始化时分配。它是在你调用 Thread.start()
.
时分配的
此外,如果您将 Thread
对象用作 Runnable
实例,那么您很可能错误地使用了 Thread
API。使用 Thread
和 Runnable
的推荐方法是声明一个 independent class 来实现 Runnable
(不是 Thread
!)。然后,将 Runnable
实例传递给 Thread
构造函数,或者(更好)将 Runnable
实例提交给线程池执行程序服务或类似服务。
自 Java 1.1 以来,扩展 Thread
已被认为是一个坏主意。
I created 1000 empty new runnables on 256M and my application froze.
冻结不太可能与简单 Runnable
实例的内存利用率有关。
但是如果您创建并启动了 1000 个线程,那么 可能 会给您带来麻烦。具有那么多线程的应用程序很容易出现严重的性能问题。但即便如此,线程堆栈的内存利用率也不会导致冻结。 (如果 JVM 内存不足,您将得到 OutOfMemoryError
... 而不是冻结,除非您关闭了 GC 开销限制保护。)
很可能是其他原因造成的冻结;例如您的线程可能已死锁。
我在谷歌上搜索,但没有找到适合我的问题的答案:
空Runnable占用多少内存class?
我要求它是因为我不知道在某些情况下什么更好 - 创建我自己的 sheduler,里面有一个 runnable,它将每隔 X 次执行一次,直到应用程序关闭,或者每次我想要时初始化新的 Runnable做一些不在主线程中的事情并直接将代码放入其中。
实现 Runnable
的 class 实例的最小大小为 8 字节。 (这是在 32 位或 64 位 JVM 上没有字段的对象的大小。)实际大小将取决于具体实现。
It is not that simple as you think.
Runnable extends Thread
and thread may take a lot of memory just by initialization.
你的推理不正确。
一个Thread
实例需要很多space,因为它有一个线程堆栈,而不是因为它实现了Runnable
。此外,线程堆栈的 space 未在线程初始化时分配。它是在你调用 Thread.start()
.
此外,如果您将 Thread
对象用作 Runnable
实例,那么您很可能错误地使用了 Thread
API。使用 Thread
和 Runnable
的推荐方法是声明一个 independent class 来实现 Runnable
(不是 Thread
!)。然后,将 Runnable
实例传递给 Thread
构造函数,或者(更好)将 Runnable
实例提交给线程池执行程序服务或类似服务。
自 Java 1.1 以来,扩展 Thread
已被认为是一个坏主意。
I created 1000 empty new runnables on 256M and my application froze.
冻结不太可能与简单 Runnable
实例的内存利用率有关。
但是如果您创建并启动了 1000 个线程,那么 可能 会给您带来麻烦。具有那么多线程的应用程序很容易出现严重的性能问题。但即便如此,线程堆栈的内存利用率也不会导致冻结。 (如果 JVM 内存不足,您将得到 OutOfMemoryError
... 而不是冻结,除非您关闭了 GC 开销限制保护。)
很可能是其他原因造成的冻结;例如您的线程可能已死锁。