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程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
随机推荐
- js精确计算
官方文档:http://mikemcl.github.io/big.js/ 使用方法: x = new Big(0.1); y = x.plus(0.2); // '0.3' var a=Big(0. ...
- linux ssh -l 命令运用
ssh是远程登录命令,-l选项是最常用的选项,下面是我的一些总结 远程登录:ssh -l userName ip # 远程登录到 10.175.23.9 ssh -l root2 10.175. ...
- 重温Javascript(一)
工作中要用到JavaScript,一组复习笔记. 一些看法 1. 想想JavaScript目前最常用的宿主环境,浏览器或者服务端V8,都是单线程,所以不用过多的考虑并发的问题,如果是协程来实现异步的方 ...
- 在ElasticSearch中使用 IK 中文分词插件
我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik ...
- .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行
本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...
- (转)Python 遍历List三种方式
转自: http://www.cnblogs.com/pizitai/archive/2017/02/14/6398276.html # 方法1 print '遍历列表方法1:' for i in l ...
- Robot framework的介绍
Robot framework是基于Python语言编写的功能自动化测试框架.使用简单,不懂编码的测试人员也能像编程一样写测试用例,支持关键字驱动测试并且可以开发系统关键字.还有丰富的第三方库,比如S ...
- angular 过滤排序
<table class="table"> <thead> <tr> <th ng-click="changeOrder('id ...
- superslide2插件
地址:http://www.superslide2.com/ 做自适应要注意该宽度和高度 等比缩放
- Java 比较(==, equals, compareTo, compare)
在Java中,有 ==, equals(), compareTo(), compare() 等方法可以比较两个值或对象,比较容易混淆.画了个简单的思维导图总结一下 Java Compares 我经常记 ...