首页 > 系统相关 >ThreadPoolExecutor 中 BlockingQueue 队列中的任务以及占用的内存

ThreadPoolExecutor 中 BlockingQueue 队列中的任务以及占用的内存

时间:2022-09-07 09:25:42浏览次数:120  
标签:占用 System RamUsageEstimator 内存 println ThreadPoolExecutor out BlockingQueue

问题

  1. ThreadPoolExecutorBlockingQueue 队列中的任务是什么?
  2. 一个任务占用的内存大小?

分析

参考 4 种方法教你如何查看 java 对象所占内存大小,编写如下代码进行测试。

POM 依赖:

<!-- 估计内存占用 -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>9.3.0</version>
</dependency>
<!-- JOL(Java Object Layout,Java 对象内存布局) -->
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>

Java 代码:

/**
 * 查看对象占用内存大小
 *
 * @author ageovb
 * @date 22/09/06 19:49
 */
public class SizeofObject {
    public static void main(String[] args) {
        // 定义一个线程,查看内存占用
        Runnable t1 = new Thread(() -> System.out.println("Thread t1 "));
        // JOL(Java Object Layout,Java 对象内存布局)
        System.out.println("ClassLayout.parseInstance: " + ClassLayout.parseInstance(t1).toPrintable());
        // Shallow Size = [类定义] + 父类fields所占空间 + 自身fields所占空间 + [alignment]
        System.out.println("RamUsageEstimator.shallowSizeOf: " + RamUsageEstimator.shallowSizeOf(t1));
        // Retained Size(JVM 概念) 是指,当实例 A 被回收时,可以同时被回收的实例的 Shallow Size 之和
        System.out.println("RamUsageEstimator.sizeOfObject:  " + RamUsageEstimator.sizeOfObject(t1));
        System.out.println();

        // 定义线程池,为了使阻塞队列中有任务,核心线程数和最大线程数都设置为 1
        LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                1, 1, 1000L, TimeUnit.SECONDS, workQueue);
        for (int i = 0; i < 3; i++) {
            // 打印阻塞队列长度及占用内存大小
            executor.execute(() -> System.out.println("workQueue size: " + executor.getQueue().size() +
                    ", bytes: " + RamUsageEstimator.sizeOfObject(executor.getQueue())));
        }
    }
}

打印日志如下:
LinkedBlockingQueue 内存占用分析

ClassLayout 分析的内存占用比 RamUsageEstimator 小一点,暂时采用 RamUsageEstimator 分析的结果。

结论

对于问题一,ThreadPoolExecutorBlockingQueue 队列中的任务是 Runnable 对象的实例,即 Thread 对象。

对于问题二,一个任务,即 Thread 对象占用 256 Byte。

标签:占用,System,RamUsageEstimator,内存,println,ThreadPoolExecutor,out,BlockingQueue
From: https://www.cnblogs.com/ageovb/p/16664077.html

相关文章

  • 同样的项目vscode 内存 93M,phpstorm 2个G
         vscodecmd+shift+p 把shellcommand添加code在环境变量中,然后可以用code.打开当前文件安装 Materialicon插件可以显示文件夹的图标......
  • [转载]Qt内存泄漏总结(包括检测工具)
    原文链接:http://blog.csdn.net/taiyang1987912/article/details/29271549关于堆栈不清楚的可以参考这篇文章:http://blog.csdn.net/c_base_jin/article/details/25558929一......
  • C#内存对齐
    C#类和字段内存对齐https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack?view=net-6.0......
  • java通过内存流去掉多行文本中的空行
    对于多行文本,你直接通过replace,replaceAll是不能将空行删除的,你需要遍历这些行,对每行文本进行操作,最后把返回新的文本才行。publicstaticStringremoveMultiRowBla......
  • 如何高效解决 C++内存问题,Apache Doris 实践之路|技术解析
    导读:ApacheDoris使用C++语言实现了执行引擎,C++开发过程中,影响开发效率的一个重要因素是指针的使用,包括非法访问、泄露、强制类型转换等。本文将会通过对Sanitizer......
  • 四种内存泄漏方法总结和比较
     关注:QStockView,获取股票智能分析报警软件目录1     简介...12     检测内存泄漏的方法...12.1    VS2015性能探测器...12.2    VLD嵌入......
  • hi3516开机修改内存和MMZ分配并安装SDK驱动
    1. 拿到的开发版中已经安装最小系统,连接串口开机,设置启动文件#配置IP地址ifconfigeth0172.16.96.151netmask255.255.248.0routeadddefaultgw172.16.100.1#......
  • *第十二章 内存管理
                                  ......
  • 内存管理——缓存一致性问题
    缓存一致性问题问题1:多核CPU与cache的缓存一致性问题多核CPU在访问内存时,每个核都有自己的cache,由于cache的写回机制,部分数据没有及时更新到内存,那么在不同线程访问同一......
  • 并发学习记录09:共享模型之内存
    Java内存模型JMM指的是Javamemorymodel,它定义了主存,工作内存等抽象概念,相当于做一个隔离层,将底层CPU寄存器,缓存,硬件内存,CPU指令优化提供的功能通过一个简单接口给使用......