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程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
随机推荐
- scipy安装问题
刚开始使用pip安装的scipy,后来报了错误,具体意思是 numpy版本不支持. 在python.org.pypi 官网上的SciPy包是一个zip版本的,要使用与numpy相对应的后缀才行,也就 ...
- 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承
1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...
- BFC详解
BFC(block formating context),翻译过来就是块级格式化上下文.我们可以理解为:BFC就是一个Block-level Box内部的Block-level Box布局的一系列规则 ...
- Android -- onMeasure()源码分析
1,作为自定义控件最重要的三个方法之一,onMeasure()可以说是我们研究的重点,今天我们更详细的来研究一下View的onMeasure()方法和ViewGroup的onMeasure()方法 2 ...
- 【Electron】Electron开发入门(四):操作PC端文件系统
一.调用PC端默认方式打开本地文件 在main.js里 // 打开系统本地文件或者网页链接 const {shell} = require('electron'); // Open a local f ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 3
formAdbRequest我们在之前已经分析过,做的事情就是组建好ADB协议的命令以待发送给ADB服务器,在我们558行中最终组建好的ADB协议命令将会如下: “host-serial:xxx:fo ...
- hdu 2157 How many ways?? (可达矩阵)
题意:给你一个有向图,从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边 思路:利用离散数学中的可达矩阵,可达矩阵的K次幂便是从i到j走K步能到达的方案数 代码: #inc ...
- Java ---理解MVC架构
之间的文章,我们主要是介绍了jsp的相关语法操作,我们可以通过请求某个jsp页面,然后由相对应的servlet实例给我们返回html页面.但是在实际的项目中,我们很少会直接的请求某个页面,一般都是请求 ...
- JavaScript 简易版 自动轮播 手动轮播 菜鸟交流
本人刚刚接触前端,许多知识还不了解,以前经常到博客园查询自己需要的东西,现在也终于反客为主了.作为新手,所展示的东西也是浅显易懂,希望同是新手的伙伴们共同交流.共同进步,若是成功捕获一位大大,也请您赐 ...
- 使用 Http 的 Get 方式读取网络数据
作为移动平台的应用,一定避免不了与网络交换数据,不论是读取网页数据,还是调用API接口,都必须掌握Http通信技术 代码如下: package zw1; import java.io.Buffered ...