Java内存使用量测试
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内存使用量测试的更多相关文章
- JAVA 大数据内存耗用测试
JAVA 大数据内存耗用测试import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- 【转】Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- java内存模型及分块
转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Ja ...
- Java内存泄漏分析与解决方案
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
- Java内存回收 - 落日之心的日志 - 网易博客
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- (转)java内存泄漏的定位与分析
转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测, ...
- java内存配置举例
常见配置举例 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~ ...
- Java内存泄露分析和解决方案及Windows自带查看工具
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
随机推荐
- Unity 3D Framework Designing(4)——设计可复用的SubView和SubViewModel(Part 1)
『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率. 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是我们熟知的『高内聚,低耦合』原则. 组件化 ...
- vs2012 asp调试设置 清单目录
在web.cong中添加 <system.webServer> <directoryBrowse enabled="true" /> </system ...
- 27. Remove Element - 移除元素-Easy
Description: Given an array and a value, remove all instances of that value in place and return the ...
- 老李分享:大数据测试之HDFS文件系统
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 纯JS写最简单的图片轮播
非常简单的一个大图轮播,通过将控制显示位置来进行轮播效果,写来给正在学习的新手朋友们参考交流. 先看效果:(实际效果没有这么快) 先看布局: <div id="display" ...
- 设计模式(三)—代理模式
目录: 一.概述 二.静态代理 三.动态代理 四.静态代理和动态代理的区别 一.概述 代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对 ...
- asp.net core源码飘香:Configuration组件
简介: 这是一个基础组件,是一个统一的配置模型,配置可以来源于配置文件(json文件,xml文件,ini文件),内存对象,命令行参数,系统的环境变量又或者是你自己扩展的配置源,该组件将各个配置源的数据 ...
- Excel import
Case Study: Reading cell content from excel template for COM variant type VT_R4 or VT_R8 is always l ...
- 计算机程序的思维逻辑 (79) - 方便的CompletionService
上节,我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用Comple ...
- 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...