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程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
随机推荐
- python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答
首先先给出总结:input () = int(raw_input()) 有图有真相!!! 先看看input的例子: 可见用input键入得到int类型的数据,那如果输入一些非int类型的会怎么样呢? ...
- Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控
背景: Open-Falcon 是小米运维部开源的一款互联网企业级监控系统解决方案,具体的安装和使用说明请见官网:http://open-falcon.org/,是一款比较全的监控.而且提供各种API ...
- Eric的第一天
我叫刘志扬(ERIC),今天第一次来博客园,我是一个爱编程的小子,我使用开发工具Androidstudio(AS)我要把今后的问题记录在博客园里,欢迎大家点评,吐槽.
- 老李分享:网页爬虫java实现
老李分享:网页爬虫java实现 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...
- 7.Redis常用命令:ZSet
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联, ...
- iOS项目之模拟请求数据
如何在iOS开发中更好的做假数据? 当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI ...
- Bootstrap基础学习(一)—表格与按钮
一.Bootstrap 概述 Bootstrap 是由 Twitter 公司(全球最大的微博)的两名技术工程师研发的一个基于HTML.CSS.JavaScript 的开源框架.该框架代码简洁 ...
- Struts2基础学习(四)—类型转换器和数据校验
一.自定义类型转换器 1.概述 Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器.Struts2 类型转换器实际上都是基于OG ...
- jQuery基础学习(二)—jQuery选择器
一.jQuery基本选择器 1.CSS选择器 在学习jQuery选择器之前,先介绍一下之前学过的CSS选择器. 选择器 语法 描述 示例 标签选择器 E { ...
- java中GUI的awt和Swing的知识点
刚刚学习了java的GUI,写了几个程序,基本熟悉了awt和Swing,下面和大家分享一下知识点 1.JFrame的层次结构 参考:http://tieba.baidu.com/p/200421612 ...