JVM内存使用量测试
测试各种不同的数据结构在JVM中的内存使用量

 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;

 import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; /** JVM内存使用量测试
* 测试各种不同的数据结构在JVM中的内存使用量
*/
public class MemUsageTest
{
static final long KILO = 1024L;
static final long MEGA = KILO * KILO; static double divide(long a, long b) {
return ((double)a)/b;
}
static StringBuilder sbMem = new StringBuilder(16);
static String memStr(long mem) {
return memStr(mem, null);
}
static String memStr(long mem, String msg) {
sbMem.setLength(0);
if(msg==null || msg.length()==0){ }else{
sbMem.append(msg).append(": ");
} if(mem == 0){
sbMem.append("0");
return sbMem.toString();
} if(mem < 0){
sbMem.append("- ");
mem = -mem;
}
if(mem >= MEGA){
sbMem.append(mem / MEGA);
sbMem.append("M ");
mem %= MEGA;
}
if(mem >= KILO){
sbMem.append(mem / KILO);
sbMem.append("K ");
mem %= KILO;
}
if(mem > 0){
sbMem.append(mem);
sbMem.append("B");
}
return sbMem.toString();
} static final Runtime RUNTIME = Runtime.getRuntime();
static final MemoryMXBean MEM_MXBEAN = ManagementFactory.getMemoryMXBean();
static long LAST_MEM = 0;
public static void printMemUsage() {
printMemUsage(null);
}
public static void printMemUsage(String msg) {
if(msg==null || msg.length()==0){
System.out.println("==================== MemUsage ====================");
}else{
System.out.println("==================== MemUsage ("+msg+") ====================");
}
System.gc(); /*System.out.println(divide(RUNTIME.totalMemory()-RUNTIME.freeMemory(), MEGA));//usage.getUsed()
System.out.println(divide(RUNTIME.totalMemory(), MEGA));//usage.getCommitted()
*/ //System.out.println(divide(RUNTIME.maxMemory(), MEGA));//usage.getMax() MemoryUsage usage = MEM_MXBEAN.getHeapMemoryUsage();
//usage = MEM_MXBEAN.getNonHeapMemoryUsage();
//System.out.println(memStr(usage.getInit()));
System.out.println(memStr(usage.getUsed(), "使用量 "));//使用量
System.out.println(memStr(usage.getUsed()-LAST_MEM, "使用量增量"));//使用量增量
System.out.println(memStr(usage.getCommitted(), "提交总量 "));//提交总量
//System.out.println(memStr(usage.getMax())); //if(LAST_MEM <= 0){
LAST_MEM = usage.getUsed();
//}
} public static int same(int i){
return i;
}
public static Object same(Object i){
return i;
} static String[] strs;
static Object[] objs;
static int[] ints;
static Integer[] integers;
static Set<Integer> integerSet;
public static void main( String[] args )
{
printMemUsage(); //String[]
//每个对象平均占用60B
strs = new String[(int) MEGA];
printMemUsage("String[]"); int i;
for(i=0;i<strs.length;i++){
//strs[i] = "";
//strs[i] = new String("");
strs[i] = String.format("%08d", i);
//strs[i] = String.valueOf(Math.random());
}
printMemUsage(); strs = null;
printMemUsage(); //Object[]
//每个对象平均占用20B
objs = new Object[(int) MEGA];
printMemUsage("Object[]"); for(i=0;i<objs.length;i++){
objs[i] = new Object();
}
printMemUsage(); objs = null;
printMemUsage(); //int[]
//每个对象平均占用4B
ints = new int[(int) MEGA];
printMemUsage("int[]"); for(i=0;i<ints.length;i++){
ints[i] = same(i);
}
printMemUsage(); ints = null;
printMemUsage(); //Integer[]
//每个对象平均占用20B
integers = new Integer[(int) MEGA];
printMemUsage("Integer[]"); for(i=0;i<integers.length;i++){
integers[i] = i;
}
printMemUsage(); integers = null;
printMemUsage(); //HashSet<Integer>
//每个对象平均占用56B
integerSet = new HashSet<Integer>(1000000);
printMemUsage("HashSet<Integer>"); for(i=0;i<MEGA;i++){
integerSet.add(i);
}
printMemUsage(); integerSet = null;
printMemUsage(); //fastutil.IntOpenHashSet
//每个对象平均占用8B
integerSet = new IntOpenHashSet(1000000);
printMemUsage("fastutil.IntOpenHashSet"); for(i=0;i<MEGA;i++){
((IntOpenHashSet)integerSet).add(i);
}
printMemUsage(); integerSet = null;
printMemUsage();
}
}

运行结果如下,由此可见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

Java内存使用量测试的更多相关文章

  1. JAVA 大数据内存耗用测试

    JAVA 大数据内存耗用测试import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean ...

  2. java内存泄漏的定位与分析

    1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...

  3. 【转】Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  4. java内存模型及分块

    转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏   1.JMM简介   i.内存模型概述 Ja ...

  5. Java内存泄漏分析与解决方案

    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...

  6. Java内存回收 - 落日之心的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  7. (转)java内存泄漏的定位与分析

    转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测, ...

  8. java内存配置举例

    常见配置举例  堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~ ...

  9. Java内存泄露分析和解决方案及Windows自带查看工具

    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...

随机推荐

  1. Sql(in与exists)

    1.如果查询的两表大小相当,那么用in和exists差别不大,如果两个表中一个较小一个较大,则子查询表小的用exists,子查询表大的用in. 2.not in逻辑上不完全等同于not exists, ...

  2. 微信小程序已经开放个人开发者申请了,还不快上车?

    前言 就在昨天(3月27号),微信公众号平台推送了文章"小程序新能力",这篇文章是广大开发者的福音.个人开发者可申请小程序!!! 小程序开放个人开发者申请注册,个人用户可访问微信公 ...

  3. 直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分

    直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分 本文是关于如何将GoogleTest和GoogleMock在没有预先编译安装在机器的情况下,直接在项目中作为项目的 ...

  4. JAVA-实例方法被覆盖,静态方法被隐藏Explain

    被覆盖比较好理解,类似于多态的实现. 被隐藏是指静态方法的访问是根据当前对象的表面类型来决定的,比如 Supers = new Sub(); s.greeting()访问的是Super的静态方法,如果 ...

  5. codeforces 372E. Drawing Circles is Fun

    tags:[圆の反演][乘法原理][尺取法]题解:圆の反演:将过O点的圆,映射成不过O的直线,相切的圆反演出来的直线平行.我们将集合S中的点做反演变换:(x,y)->(x/(x^2+y^2), ...

  6. nosql使用感受

    最近一个项目尝试了使用ssdb(一个类似于redis的数据结构数据库),主要感受有几点: 优势 nosql的无模式在修改和插入时很方便,不需要预先新建表或者修改表结构来新加字段,只需要代码里面使用就行 ...

  7. 测试开发Python培训:模拟登录新浪微博-技术篇

    测试开发Python培训:模拟登录新浪微博-技术篇   一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技 ...

  8. Shiro基础学习(一)—权限管理

    一.基本概念 1.权限管理      只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.     权限管理 ...

  9. 实现高效的GPRS驱动程序

    1. 引言 用过几款GPRS模块,也从淘宝上买过多个GPRS模块,一般的都会送一个驱动程序和使用demo,但是代码质量都较低. 回头看了下几年前使用的GPRS代码,从今天的角度来看,也就是买模块赠送一 ...

  10. 用exe4j将jar包转成.exe文件的教程

    标准版教程再这里 http://pan.baidu.com/s/1i3gn0Br 1.    下载安装exe4j文件,并把你的java文件生成jar格式的文件,在桌面新建一个文件夹,把jar文件放进去 ...