我在谷歌上搜索,但没有找到我的问题的好的答案:
空的 Runnable 类需要多少内存?
我之所以要求它,是因为我不知道在某些情况下什么更好 - 创建我自己的调度程序,其中包含单个可运行的内容,该调度程序将每 X 次执行一次,直到应用程序关闭,或者每次我想做的时候都会初始化新的可运行的内容不在主线程中的东西,并将代码直接放入其中。
最佳答案
实现 Runnable 的类实例的最小大小为 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
实例占用大量空间,因为它有一个线程堆栈,而不是因为它实现了 Runnable
。此外,线程初始化时并未分配线程堆栈的空间。它是在您调用 Thread.start() 时分配的。
此外,如果您使用 Thread
对象作为 Runnable
实例,那么您可能会错误地使用 Thread
API。使用 Thread
和 Runnable
的推荐方法是声明一个实现 Runnable
的独立类(而不是 线程
!)。然后,将 Runnable
实例传递给 Thread
构造函数,或者(更好)将 Runnable
实例提交给线程池执行器服务或类似服务。
自 Java 1.1 时代起,扩展线程
就被认为是一个坏主意。
I created 1000 empty new runnables on 256M and my application froze.
卡住不太可能与简单 Runnable
实例的内存利用率有关。
但是如果您创建并启动了 1000 个线程,那么可能会给您带来麻烦。具有如此多线程的应用程序可能会出现严重的性能问题。但即便如此,线程堆栈的内存利用率也不会导致卡住。 (如果 JVM 内存不足,您将收到 OutOfMemoryError
...而不是卡住,除非您关闭了 GC 开销限制保护。)
很可能是由于其他原因导致卡住;例如您的线程可能已经死锁。
关于java - 空的 Runnable 类需要多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834531/