Java内存使用量测试 看看我们天天在用的JVM到底浪费了多少内存资源
JVM内存使用量测试
测试各种不同的数据结构在JVM中的内存使用量
1 import it.unimi.dsi.fastutil.ints.IntOpenHashSet; 2 3 import java.lang.management.ManagementFactory; 4 import java.lang.management.MemoryMXBean; 5 import java.lang.management.MemoryUsage; 6 import java.util.HashSet; 7 import java.util.Map; 8 import java.util.Set; 9 10 /** JVM内存使用量测试 11 * 测试各种不同的数据结构在JVM中的内存使用量 12 */ 13 public class MemUsageTest 14 { 15 static final long KILO = 1024L; 16 static final long MEGA = KILO * KILO; 17 18 static double divide(long a, long b) { 19 return ((double)a)/b; 20 } 21 static StringBuilder sbMem = new StringBuilder(16); 22 static String memStr(long mem) { 23 return memStr(mem, null); 24 } 25 static String memStr(long mem, String msg) { 26 sbMem.setLength(0); 27 if(msg==null || msg.length()==0){ 28 29 }else{ 30 sbMem.append(msg).append(": "); 31 } 32 33 if(mem == 0){ 34 sbMem.append("0"); 35 return sbMem.toString(); 36 } 37 38 if(mem < 0){ 39 sbMem.append("- "); 40 mem = -mem; 41 } 42 if(mem >= MEGA){ 43 sbMem.append(mem / MEGA); 44 sbMem.append("M "); 45 mem %= MEGA; 46 } 47 if(mem >= KILO){ 48 sbMem.append(mem / KILO); 49 sbMem.append("K "); 50 mem %= KILO; 51 } 52 if(mem > 0){ 53 sbMem.append(mem); 54 sbMem.append("B"); 55 } 56 return sbMem.toString(); 57 } 58 59 static final Runtime RUNTIME = Runtime.getRuntime(); 60 static final MemoryMXBean MEM_MXBEAN = ManagementFactory.getMemoryMXBean(); 61 static long LAST_MEM = 0; 62 public static void printMemUsage() { 63 printMemUsage(null); 64 } 65 public static void printMemUsage(String msg) { 66 if(msg==null || msg.length()==0){ 67 System.out.println("==================== MemUsage ===================="); 68 }else{ 69 System.out.println("==================== MemUsage ("+msg+") ===================="); 70 } 71 System.gc(); 72 73 /*System.out.println(divide(RUNTIME.totalMemory()-RUNTIME.freeMemory(), MEGA));//usage.getUsed() 74 System.out.println(divide(RUNTIME.totalMemory(), MEGA));//usage.getCommitted() 75 */ //System.out.println(divide(RUNTIME.maxMemory(), MEGA));//usage.getMax() 76 77 MemoryUsage usage = MEM_MXBEAN.getHeapMemoryUsage(); 78 //usage = MEM_MXBEAN.getNonHeapMemoryUsage(); 79 //System.out.println(memStr(usage.getInit())); 80 System.out.println(memStr(usage.getUsed(), "使用量 "));//使用量 81 System.out.println(memStr(usage.getUsed()-LAST_MEM, "使用量增量"));//使用量增量 82 System.out.println(memStr(usage.getCommitted(), "提交总量 "));//提交总量 83 //System.out.println(memStr(usage.getMax())); 84 85 //if(LAST_MEM <= 0){ 86 LAST_MEM = usage.getUsed(); 87 //} 88 } 89 90 public static int same(int i){ 91 return i; 92 } 93 public static Object same(Object i){ 94 return i; 95 } 96 97 static String[] strs; 98 static Object[] objs; 99 static int[] ints; 100 static Integer[] integers; 101 static Set<Integer> integerSet; 102 public static void main( String[] args ) 103 { 104 printMemUsage(); 105 106 //String[] 107 //每个对象平均占用60B 108 strs = new String[(int) MEGA]; 109 printMemUsage("String[]"); 110 111 int i; 112 for(i=0;i<strs.length;i++){ 113 //strs[i] = ""; 114 //strs[i] = new String(""); 115 strs[i] = String.format("%08d", i); 116 //strs[i] = String.valueOf(Math.random()); 117 } 118 printMemUsage(); 119 120 strs = null; 121 printMemUsage(); 122 123 //Object[] 124 //每个对象平均占用20B 125 objs = new Object[(int) MEGA]; 126 printMemUsage("Object[]"); 127 128 for(i=0;i<objs.length;i++){ 129 objs[i] = new Object(); 130 } 131 printMemUsage(); 132 133 objs = null; 134 printMemUsage(); 135 136 //int[] 137 //每个对象平均占用4B 138 ints = new int[(int) MEGA]; 139 printMemUsage("int[]"); 140 141 for(i=0;i<ints.length;i++){ 142 ints[i] = same(i); 143 } 144 printMemUsage(); 145 146 ints = null; 147 printMemUsage(); 148 149 //Integer[] 150 //每个对象平均占用20B 151 integers = new Integer[(int) MEGA]; 152 printMemUsage("Integer[]"); 153 154 for(i=0;i<integers.length;i++){ 155 integers[i] = i; 156 } 157 printMemUsage(); 158 159 integers = null; 160 printMemUsage(); 161 162 //HashSet<Integer> 163 //每个对象平均占用56B 164 integerSet = new HashSet<Integer>(1000000); 165 printMemUsage("HashSet<Integer>"); 166 167 for(i=0;i<MEGA;i++){ 168 integerSet.add(i); 169 } 170 printMemUsage(); 171 172 integerSet = null; 173 printMemUsage(); 174 175 //fastutil.IntOpenHashSet 176 //每个对象平均占用8B 177 integerSet = new IntOpenHashSet(1000000); 178 printMemUsage("fastutil.IntOpenHashSet"); 179 180 for(i=0;i<MEGA;i++){ 181 ((IntOpenHashSet)integerSet).add(i); 182 } 183 printMemUsage(); 184 185 integerSet = null; 186 printMemUsage(); 187 } 188 }
运行结果如下,由此可见JVM对String、Object、封装类型(如Integer)等的存储均有较大的消耗。
使用fastutil的集合类,可以比Java系统集合类节省不少的内存空间,因为HashMap、HashSet等类不仅不支持直接存放原始类型int,而且还要把存储的对象封装成Node(哈希桶链表的节点),这里消耗的内存空间比fastutil多出了7倍之多!
==================== MemUsage ==================== 使用量 : 1M 187K 384B 使用量增量: 1M 187K 384B 提交总量 : 123M ==================== MemUsage (String[]) ==================== 使用量 : 4M 546K 128B 使用量增量: 3M 358K 768B 提交总量 : 123M ==================== MemUsage ==================== 使用量 : 60M 730K 728B 使用量增量: 56M 184K 600B 提交总量 : 622M 512K ==================== MemUsage ==================== 使用量 : 730K 712B 使用量增量: - 60M 16B 提交总量 : 632M 512K ==================== MemUsage (Object[]) ==================== 使用量 : 4M 730K 728B 使用量增量: 4M 16B 提交总量 : 606M ==================== MemUsage ==================== 使用量 : 20M 730K 728B 使用量增量: 16M 提交总量 : 631M ==================== MemUsage ==================== 使用量 : 730K 712B 使用量增量: - 20M 16B 提交总量 : 631M 512K ==================== MemUsage (int[]) ==================== 使用量 : 4M 730K 728B 使用量增量: 4M 16B 提交总量 : 629M 512K ==================== MemUsage ==================== 使用量 : 4M 730K 728B 使用量增量: 0 提交总量 : 602M ==================== MemUsage ==================== 使用量 : 730K 712B 使用量增量: - 4M 16B 提交总量 : 629M ==================== MemUsage (Integer[]) ==================== 使用量 : 4M 730K 728B 使用量增量: 4M 16B 提交总量 : 606M ==================== MemUsage ==================== 使用量 : 20M 728K 728B 使用量增量: 15M 1022K 提交总量 : 625M 512K ==================== MemUsage ==================== 使用量 : 730K 712B 使用量增量: - 19M 1022K 16B 提交总量 : 627M 512K ==================== MemUsage (HashSet<Integer>) ==================== 使用量 : 730K 952B 使用量增量: 240B 提交总量 : 627M 512K ==================== MemUsage ==================== 使用量 : 56M 729K 368B 使用量增量: 55M 1022K 440B 提交总量 : 628M ==================== MemUsage ==================== 使用量 : 731K 288B 使用量增量: - 55M 1022K 80B 提交总量 : 642M ==================== MemUsage (fastutil.IntOpenHashSet) ==================== 使用量 : 8M 795K 288B 使用量增量: 8M 64K 提交总量 : 610M ==================== MemUsage ==================== 使用量 : 8M 751K 152B 使用量增量: - 44K 136B 提交总量 : 638M ==================== MemUsage ==================== 使用量 : 751K 88B 使用量增量: - 8M 64B 提交总量 : 602M
转载于:https://www.cnblogs.com/SonicU/p/6853485.html
Java内存使用量测试 看看我们天天在用的JVM到底浪费了多少内存资源相关推荐
- Android内存泄露测试不再蓝瘦,香菇
在进行Android内存泄露分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄露测试之后,是否有勇气告诉开发同事程序已经没有内存泄露,可以放心发布了? 众所周知,内存泄露测试难点 ...
- JVM堆大小与机器内存大小的一点探究
一个非核心服务申请的机器是2c4G 同时设置的-Xms =4g ,-Xmx = 4g 理论上机器系统.线程等都需要一部分内存空间的,所以我们通常设置的JVM堆大小小于机器内存 但为什么这个服务没有问题 ...
- java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低
java8默认内存收集器 大小对于软件至关重要. 很明显,与大的整体方法相比,在微服务体系结构中使用小片段具有更多优势. 最新的Java版本的Jigsaw有助于分解旧应用程序或从头开始构建新的云原生应 ...
- 使用正确的垃圾收集器将Java内存使用量降至最低
大小对于软件至关重要. 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势. 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序. 这种方法减少了 ...
- 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小. RSS 不包括进入交换分区的内存. RSS 包括共享库占用的内存(只要共享库在内存中) RSS 包括所有分配的栈 ...
- Java拆解最多的素数之和_java - 计算并打印第n个素数 - 堆栈内存溢出
为了计算第n个素数,我知道两个主要的变体. 直截了当的方式 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 这可以通过不同程度的复杂性和效率来完成,并且在概念上有两种不同的实现方式. ...
- Java XMPP负载测试工具
在本文中,我们将开发用Java编写的XMPP负载测试工具. 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1. 创建一个新的Maven项目 ...
- gifcam使用缩小内存_Fedora 上的桌面环境内存占用测试 | Linux 中国
通常,根据功能.外观和其它品质,选择桌面是一件非常个人的偏好.但有时,你选择的桌面环境还会受到硬件限制.-- Troy Dawson Fedora 中有 40 多种桌面环境(DE).每种桌面环境都有自 ...
- zz:Android 内存优化测试
Android 内存优化测试 今天做了个内存优化的小测试,包括两点 1, 比较Drawable与Bitmap占用内存大小 2, 比较BitmapFactory类的decodeResource方法与 ...
最新文章
- 科大讯飞语音转文字以及中文分词的Java测试代码
- 如何让整个表格高度固定_Saas产品中,表格设计有哪些要点
- Monte carlo
- 用ADOQuery创建SQL Server数据库,并创建表结构、存储过程和视图
- iphone如何信任软件_苹果iPhone手机安装两个微信教程
- python场景识别_python 场景
- 顶点计划 抄作业问题讨论
- PHP使用 uEditor富文本编辑器
- vue源码解析-实现
- 对大学的规划 计算机专业,对计算机专业的认识及你大学四年的规划与设想
- 跳转微信公众号首页方式
- 为什么项目经理比程序员工资高?
- Java学习第一周总结
- SpringBoot 入门
- 系统服务器与手机关系,手机与云服务器交互
- E430 win7 下安装黑苹果系统
- 类和对象:类与对象定义
- 阵列分组,不足数,补足
- 桥梁防船撞智能预警系统方案讨论
- elasticsearch线上调优[ Data too large]
热门文章
- java 线程崩溃_java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理...
- Java写 soapclient_Java for Web学习笔记(一一八):【篇外】Soap client
- 【深度学习】卷积神经网络实现图像多分类的探索
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法
- python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
- kafka java_Kafka 使用Java实现数据的生产和消费demo
- 子网划分为什么全0全1子网号不能使用?CIDR为什么能使用全0全1子网号?
- 预计2021年电视出货量有所上涨,网络推广外包之下OLED大肆布局
- 浅析日常网站建设中运营与优化的工作重点
- java mqtt 断开连接,可以将MQTT Paho客户端断开连接吗?