当前位置: 首页 > article >正文

【JVM】生产内存占用异常优化 (一)

记录一次 - 内存占用优化

某个导出,导出数据量过大总是导致OOM,但是根据需求,导出数据大小并没有那么大

按照导出数据的查询来看

 SELECT
        g.inventory_code,
        g.visit_record_code,
        g.recovery_price AS transactionAmount
FROM
crm_goods g
...
...

三个字段大小预计大小100W数据应该是不大于100m的,但是现实是1个G都不够用,果断开启MAT,查看最大对象如下
在这里插入图片描述
震惊,100w个单纯对象声明,竟然占用了1.3GB内存,于是我测试了一下原对象全部字段和单纯查询三个字段声明100W个的差距

		ArrayList<VisitGoodsInfoResp> visitGoodsInfoResps = new ArrayList<>(1000000);
		ArrayList<VisitGoodsInfoExport> visitGoodsInfoExports = new ArrayList<>(1000000);
		for (int i = 0; i < 1000000; i++) {
			VisitGoodsInfoResp visitGoodsInfoResp1 = new VisitGoodsInfoResp();
			visitGoodsInfoResps.add(visitGoodsInfoResp1);
			VisitGoodsInfoExport visitGoodsInfoExport1 = new VisitGoodsInfoExport();
			visitGoodsInfoExports.add(visitGoodsInfoExport1);

		}

MAT分析如下
在这里插入图片描述

两个竟然差距如此之大,我们使用jol工具看下两个对象的差距

com.VisitGoodsInfoResp object internals:
 OFFSET  SIZE                      TYPE DESCRIPTION                                          VALUE
      0     4                           (object header)                                      01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4                           (object header)                                      00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4                           (object header)                                      05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059)
     12     4          java.lang.String VisitGoodsInfoResp.inventoryCode                     null
     16     4          java.lang.String VisitGoodsInfoResp.name                              null
    ...
    ... 省略N个字段
    ...
    652     4          java.lang.String VisitGoodsInfoResp.dockingCustomerDeptName           null
    656     4   java.time.LocalDateTime VisitGoodsInfoResp.registrationTime                  null
    660     4      java.math.BigDecimal VisitGoodsInfoResp.salesTransitCount                 null
Instance size: 664 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total


com.VisitGoodsInfoExport object internals:
 OFFSET  SIZE                   TYPE DESCRIPTION                               VALUE
      0     4                        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4                        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4                        (object header)                           8b c3 00 f8 (10001011 11000011 00000000 11111000) (-134167669)
     12     4       java.lang.String VisitGoodsInfoExport.inventoryCode        null
     16     4   java.math.BigDecimal VisitGoodsInfoExport.transactionAmount    null
     20     4       java.lang.String VisitGoodsInfoExport.visitRecordCode      null
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

可以看出一个声明为24bytes一个为664bytes,这个还是开启了指针压缩的,若是堆栈内存超过32GB,无法施行压缩,则会多占用更多内存。由此可见,虽然java已经很大限度的帮我们管理内存,但是在编程过程中涉及到大数据梁的时候还是要有对应的空间意识的。


http://www.kler.cn/a/271693.html

相关文章:

  • VLLM性能调优
  • STM32 TIM输入捕获 测量频率
  • 知识库管理驱动企业知识流动与工作协同创新模式
  • 面试经典150题——图
  • PPT自动化 python-pptx -7: 占位符(placeholder)
  • 文本左右对齐
  • 前端跨平台开发框架:简化多端开发的利器
  • 一文总结python的异常数据处理示例
  • Python实战:Matplotlib绘图基础与实践
  • 科研绘图一:箱线图(添加贝赛尔曲线)
  • Android Studio字体大小调节
  • 记录对NSIS的一些微调 实现Electron安装包美化
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Rating)
  • 数据结构 之 树
  • SSA-LSTM多输入分类预测 | 樽海鞘优化算法-长短期神经网络 | Matlab
  • 2024.3.17每日一题
  • 【C语言】关于字符的一些实用函数
  • JS:轮播图终极版
  • kafka集群介绍
  • 探秘Nutch:揭秘开源搜索引擎的工作原理与无限应用可能(三)
  • 【NC14399】素数判断
  • Java实现简单的通讯录
  • 制定游戏开发里程碑和迭代周期的最佳实践是什么?
  • 为什么使用RedisDesktopManager可以连上redis,微服务似乎无法访问redis
  • 产品推荐 - 基于FPGA XC7K325T+DSP TMS320C6678的双目交汇视觉图像处理平台
  • 3 种方法限制 K8s Pod 磁盘容量使用