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到底浪费了多少内存资源相关推荐

  1. Android内存泄露测试不再蓝瘦,香菇

    在进行Android内存泄露分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄露测试之后,是否有勇气告诉开发同事程序已经没有内存泄露,可以放心发布了? 众所周知,内存泄露测试难点 ...

  2. JVM堆大小与机器内存大小的一点探究

    一个非核心服务申请的机器是2c4G 同时设置的-Xms =4g ,-Xmx = 4g 理论上机器系统.线程等都需要一部分内存空间的,所以我们通常设置的JVM堆大小小于机器内存 但为什么这个服务没有问题 ...

  3. java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低

    java8默认内存收集器 大小对于软件至关重要. 很明显,与大的整体方法相比,在微服务体系结构中使用小片段具有更多优势. 最新的Java版本的Jigsaw有助于分解旧应用程序或从头开始构建新的云原生应 ...

  4. 使用正确的垃圾收集器将Java内存使用量降至最低

    大小对于软件至关重要. 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势. 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序. 这种方法减少了 ...

  5. 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx

    RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小. RSS 不包括进入交换分区的内存. RSS 包括共享库占用的内存(只要共享库在内存中) RSS 包括所有分配的栈 ...

  6. Java拆解最多的素数之和_java - 计算并打印第n个素数 - 堆栈内存溢出

    为了计算第n个素数,我知道两个主要的变体. 直截了当的方式 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 这可以通过不同程度的复杂性和效率来完成,并且在概念上有两种不同的实现方式. ...

  7. Java XMPP负载测试工具

    在本文中,我们将开发用Java编写的XMPP负载测试工具. 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1. 创建一个新的Maven项目 ...

  8. gifcam使用缩小内存_Fedora 上的桌面环境内存占用测试 | Linux 中国

    通常,根据功能.外观和其它品质,选择桌面是一件非常个人的偏好.但有时,你选择的桌面环境还会受到硬件限制.-- Troy Dawson Fedora 中有 40 多种桌面环境(DE).每种桌面环境都有自 ...

  9. zz:Android 内存优化测试

    Android 内存优化测试 今天做了个内存优化的小测试,包括两点 1,  比较Drawable与Bitmap占用内存大小 2,  比较BitmapFactory类的decodeResource方法与 ...

最新文章

  1. 科大讯飞语音转文字以及中文分词的Java测试代码
  2. 如何让整个表格高度固定_Saas产品中,表格设计有哪些要点
  3. Monte carlo
  4. 用ADOQuery创建SQL Server数据库,并创建表结构、存储过程和视图
  5. iphone如何信任软件_苹果iPhone手机安装两个微信教程
  6. python场景识别_python 场景
  7. 顶点计划 抄作业问题讨论
  8. PHP使用 uEditor富文本编辑器
  9. vue源码解析-实现
  10. 对大学的规划 计算机专业,对计算机专业的认识及你大学四年的规划与设想
  11. 跳转微信公众号首页方式
  12. 为什么项目经理比程序员工资高?
  13. Java学习第一周总结
  14. SpringBoot 入门
  15. 系统服务器与手机关系,手机与云服务器交互
  16. E430 win7 下安装黑苹果系统
  17. 类和对象:类与对象定义
  18. 阵列分组,不足数,补足
  19. 桥梁防船撞智能预警系统方案讨论
  20. elasticsearch线上调优[ Data too large]

热门文章

  1. java 线程崩溃_java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理...
  2. Java写 soapclient_Java for Web学习笔记(一一八):【篇外】Soap client
  3. 【深度学习】卷积神经网络实现图像多分类的探索
  4. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法
  5. python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
  6. kafka java_Kafka 使用Java实现数据的生产和消费demo
  7. 子网划分为什么全0全1子网号不能使用?CIDR为什么能使用全0全1子网号?
  8. 预计2021年电视出货量有所上涨,网络推广外包之下OLED大肆布局
  9. 浅析日常网站建设中运营与优化的工作重点
  10. java mqtt 断开连接,可以将MQTT Paho客户端断开连接吗?