java - 空的 Runnable 类需要多少内存?

标签 java memory jvm runnable

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

空的 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。使用 ThreadRunnable 的推荐方法是声明一个实现 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/

相关文章:

Java 链接正则表达式

c++ - 如果 std::vector 包含的元素尺寸增大,是否必须调整其大小?

c# - PInvoke 结构/函数中的奇怪错误

csv - 使用 Cassava 在内存中加载 CSV

java - 为什么 Java 中的字节表示以十进制存储数据?

java - 如何在 JSP 中加载主体内的 CSS?

java - 如何从 native 函数返回 QAndroidJniObject?

java - 使用什么代替 postDelayed 来节省内存

java - 堆大小迅速增加 spring boot 应用程序

java - 避免需要设置 jmxremote 端口(以远程使用 VisualVM)?