一 概述

最近需求,打算再内存缓存数据,数据量130000万并且还会增加,了解这些数据占用空间的大小是很常见的监控需要。

常规方式,人工可以按照Java基础数据类型大小及内容大小估算出缓存对象的大概堆占用,但是麻烦还不准。

OpenJDK,提供了JOL包,可以帮我们在运行时计算某个对象的大小,是非常好的工具

官网:http://openjdk.java.net/projects/code-tools/jol/

定位:分析对象在JVM的大小和分布

依赖:

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>put-the-version-here</version>
</dependency>

二 使用

1)准备一个map,用于测试JOL Api的结果

static Object generate() {Map<String, Object> map = new HashMap<>();map.put("a", new Integer(1));map.put("b", "b");map.put("c", new Date());for (int i = 0; i < 10; i++) {map.put(String.valueOf(i), String.valueOf(i));}return map;}

 2)常用的几个方法

(1)查看对象内部信息: ClassLayout.parseInstance(obj).toPrintable()

(2)查看对象外部信息:包括引用的对象:GraphLayout.parseInstance(obj).toPrintable()

(3)查看对象占用空间总大小:GraphLayout.parseInstance(obj).totalSize()

三 完整Demo

package x.demo.java;import java.util.Date;
import java.util.HashMap;
import java.util.Map;import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.info.GraphLayout;public class JolDemo {static Object generate() {Map<String, Object> map = new HashMap<>();map.put("a", new Integer(1));map.put("b", "b");map.put("c", new Date());for (int i = 0; i < 10; i++) {map.put(String.valueOf(i), String.valueOf(i));}return map;}static void print(String message) {System.out.println(message);System.out.println("-------------------------");}public static void main(String[] args) {Object obj = generate();//查看对象内部信息print(ClassLayout.parseInstance(obj).toPrintable());//查看对象外部信息print(GraphLayout.parseInstance(obj).toPrintable());//获取对象总大小print("size : " + GraphLayout.parseInstance(obj).totalSize());}
}

Java 对象布局、大小工具 jar包工具类jol相关推荐

  1. Stegsolve查看隐水印(暗水印)java jar包工具

    Stegsolve查看隐水印.隐写水印.暗水印的java jar包工具 (1)下载jar包 file/Stegsolve.jar at main · zhangphil/file · GitHubCo ...

  2. java统计空间占用_JVM —— Java 对象占用空间大小计算

    引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...

  3. JVM —— Java 对象占用空间大小计算

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...

  4. 一步一步学java(7):jar包使用方法及常用jar包分类汇总(持续更新)

    java最大的特点和优势就是纯面向对象.开源,除了JDK.JRE自带的基础类库之外,还有非常多的大牛们开发了各种应用的类库(jar包),本篇主要介绍一下这些类库的使用方法,并把常用jar包分类汇总,以 ...

  5. 在cmd中使用命令来编译并运行java程序,导入其他jar包,使用windows批处理文件

    一.使用cmd编译并运行java程序 今天帮朋友做一件事,他是一个不懂技术的人,说需要一个工具来做数据筛选,没有什么学识的我只想到了使用java程序来实现,于是上去就是一通abcd,玩笑归玩笑,做完了 ...

  6. java 中如何打包成 jar 包

    这里写目录标题 1. java 中如何打包成 jar 包 1.1. 手动打包可直接执行的 jar 包 1.2. 使用 intellij idea 工具打包可直接执行的 jar 包 1. java 中如 ...

  7. Virbox Protector Java 虚拟化上线!支持jar包二次调用!

    Java 程序简介 Java 是上世纪90年代初由 SUN 公司开发的一种面向对象编程语言,因其语法简单.跨平台.拥有丰富又成熟的框架,开发效率高,在服务端应用.Web 应用等领域形成了巨大优势,成为 ...

  8. JAVA对象布局之对象头(Object Header)

    由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 .在学习并发编程知识synchronized时,我们总是难以理解其实 ...

  9. JS播放音频 JS播放mp3 JS播放音乐 Java播放音频 Java播放音乐 Java播放mp3 的jmp123.jar包安装 语音播报 Java获取根路径

    JS播放音频 JS播放mp3 // @Bind #jsPlayMp3Btn.onClick !function(self, arg) {var mp3Url = "http://localh ...

  10. java9可执行jar_单个java文件打成可执行jar包

    1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...

最新文章

  1. dockerfile kafka
  2. 瞧瞧,这样的代码才叫Pythonic
  3. 7-3 逆序的三位数 (Java)
  4. php和python对比-通过PHP与Python代码对比浅析语法差异
  5. 遭遇sal.xls.exe
  6. 字符串格式化---StrFormatter
  7. Facebook推出人脸识别新功能,防止用户肖像遭滥用
  8. python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel
  9. 记录uni-app弹框事件无生命周期问题;uni-popup-dialog打开触发事件;uni-popup-dialog调用接口时机
  10. jstree中json data 的生成
  11. (转)币圈人物志 BM(EOS,BTS,Steem缔造者)
  12. 带领初学者学习 SQL 数据库编程视频教程(28 个视频)
  13. java定时任务_定时任务3种实现方式
  14. axis调用webservice
  15. 使用wps的邮件合并和文档附件制作带照片的准考证
  16. 基于 go-cqhttp 开发的 SSPU的QQ机器人小助手
  17. 一文扫尽检测类评估指标:AP、mAP、ReCall、OKS和IoU
  18. 为中国操作系统内核而写的教程 1
  19. 写给程序员看的面向对象摄影技巧
  20. USB接口测试器--USB2.0/USB3.0信号检测器

热门文章

  1. mysql-connector-java 5.1.13,Java连MySQL,mysql-connector-java-5.1.13-bin.jar究竟要怎
  2. 重置单例对象Singleton Swift
  3. c语言显示cpuid_ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
  4. tableau示例超市数据在哪儿_Tableau | 超市销售数据可视化分析
  5. Bitwise AND of Numbers Range
  6. matlab仿真之大尺度衰落因子的产生
  7. vector容器v1、v2之间相互赋值的三种方法及易错点详解
  8. 【ide】myeclipse项目右键没有configure
  9. mysql去掉两个最高分_Excel函数 去掉最高分和最低分取平均值?这个函数不可不知...
  10. oracle的sql字符串转义,sql – 在Oracle数据库中搜索带转义的字符串