空Runnable类需要多少内存?

时间:2018-02-16 20:39:36

标签: java memory jvm runnable

我在谷歌搜索,但我没有找到我的问题的好答案:

多少内存需要空的Runnable类?

我要求它,因为我不知道在某些情况下什么是更好的 - 创建我自己的sheduler,其中包含单个runnable内部,每隔X次执行一次,直到aplication关闭,或者每当我想做的时候初始化新的Runnable不在主线程中的东西,直接把代码放到这个。

1 个答案:

答案 0 :(得分:1)

实现Runnable的类实例的最小大小为8个字节。 (这是32或64位JVM上没有字段的对象的大小。)实际大小取决于具体实现。

  

你想的并不是那么简单。 Runnable extends Thread和线程可能仅通过初始化占用大量内存。

你的推理不正确。

Thread实例占用大量空间,因为它有一个线程堆栈,而不是因为它实现了Runnable。此外,初始化线程时不分配线程堆栈的空间。它是在您致电Thread.start()时分配的。

此外,如果您将Thread个对象用作Runnable个实例,则可能错误地使用Thread API。使用ThreadRunnable的推荐方法是声明一个实现Runnable(不是Thread!)的独立类。然后,将Runnable实例传递给Thread构造函数,或者(更好)将Runnable实例提交给线程池执行服务或类似服务。

自Java 1.1以来,人们已经认识到扩展Thread是一个坏主意。

  

我在256M上创建了1000个空的新runnables,我的应用程序冻结了。

冻结不太可能与简单Runnable实例的内存利用率有关。

但是如果你创建并启动了1000个线程,那么可以让你陷入困境。具有该多个线程的应用程序可能存在严重的性能问题。但即便如此,线程堆栈的内存利用率也不会导致冻结。 (如果JVM内存不足,除非您关闭了GC开销限制保护,否则将获得OutOfMemoryError ...而不是冻结。)

冻结可能是出于其他原因;例如你的线程可能已陷入僵局。