空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。使用 ThreadRunnable 的推荐方法是声明一个 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 开销限制保护。)

很可能是其他原因造成的冻结;例如您的线程可能已死锁。