我在谷歌搜索,但我没有找到我的问题的好答案:
多少内存需要空的Runnable类?
我要求它,因为我不知道在某些情况下什么是更好的 - 创建我自己的sheduler,其中包含单个runnable内部,每隔X次执行一次,直到aplication关闭,或者每当我想做的时候初始化新的Runnable不在主线程中的东西,直接把代码放到这个。
答案 0 :(得分:1)
实现Runnable
的类实例的最小大小为8个字节。 (这是32或64位JVM上没有字段的对象的大小。)实际大小取决于具体实现。
你想的并不是那么简单。
Runnable extends Thread
和线程可能仅通过初始化占用大量内存。
你的推理不正确。
Thread
实例占用大量空间,因为它有一个线程堆栈,而不是因为它实现了Runnable
。此外,初始化线程时不分配线程堆栈的空间。它是在您致电Thread.start()
时分配的。
此外,如果您将Thread
个对象用作Runnable
个实例,则可能错误地使用Thread
API。使用Thread
和Runnable
的推荐方法是声明一个实现Runnable
(不是Thread
!)的独立类。然后,将Runnable
实例传递给Thread
构造函数,或者(更好)将Runnable
实例提交给线程池执行服务或类似服务。
自Java 1.1以来,人们已经认识到扩展Thread
是一个坏主意。
我在256M上创建了1000个空的新runnables,我的应用程序冻结了。
冻结不太可能与简单Runnable
实例的内存利用率有关。
但是如果你创建并启动了1000个线程,那么可以让你陷入困境。具有该多个线程的应用程序可能存在严重的性能问题。但即便如此,线程堆栈的内存利用率也不会导致冻结。 (如果JVM内存不足,除非您关闭了GC开销限制保护,否则将获得OutOfMemoryError
...而不是冻结。)
冻结可能是出于其他原因;例如你的线程可能已陷入僵局。