「java对象内存大小统计」java对象内存分析
本篇文章给大家谈谈java对象内存大小统计,以及java对象内存分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、一个Java对象到底占用多大内存
- 2、一个Java对象到底占多大内存
- 3、如何查看java对象所占的内存大小
- 4、用Java怎么测试一个对象所占的内存的大小?
- 5、如何计算Java对象所占内存的大小
一个Java对象到底占用多大内存
Object o=new Object():
在java中空对象占八个字节,对象的引用占四个字节。所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16byte.
举个例子:
Class O{
int i;
byte j;
String s;
}
其所占内存的大小是空对象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整数倍,所以其占大小为24byte.
当然,如果类里有其他对象的话,也要把其他对象的空间算进去
一个Java对象到底占多大内存
第一问中,integer,Double是可以准确知道大小的
java中int double(包装类分别是Integer和Double,实际是一样的)分别占用的大小是4B 和8B
这里说的B,就是我们通常说的KB中的那个B,全称是Byte。
1B = 8bit。 所以我们通常会说int是32位,有时候又4字节
而String他是有char数组组成,一个长度为10的String,占用的char就是10个,一个char是2B。
所以看String占多少内存,需要知道String的长度
二问中:答案是可以的
摘自ObjectOutPutStream的API说明
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();
如何查看java对象所占的内存大小
我们为什么想要知道对象所占对内存的大小呢? (1)做一些cache的时候,我们不可能把数据库的所有的数据都缓存到内存里面,我们要估计缓存的大小。 (2)内存泄露的时候,我们可以查看某些对象的大小来定位问题,当然还有其他的更有效的方式,比如使用MAT分析dump文件 (3)根据jvm的堆内存设置,我们可以知道最多可以创建多少个对象。 从jdk5开始,提供了Instrumentation API,它有一个叫做getObjectSize()的方法,但是,这个方法存在两个问题: (1)不可以直接使用。必须要实现一个Instrumentation Agent,还得放到jar包里面。 (2)它只能返回单个对象的大小,不能返回内部包含的子对象的大小。 完整的代码如下: package com.bj58.test; import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.IdentityHashMap; import java.util.Map; import java.util.Stack; public class SizeOfAgent { static Instrumentation inst; /** initializes agent */ public static void premain(String agentArgs, Instrumentation instP) { inst = instP; } /** * Returns object size without member sub-objects. * * @param o * object to get size of * @return object size */ public static long sizeOf(Object o) { if (inst == null) { throw new IllegalStateException( "Can not access instrumentation environment.\n" + "Please check if jar file containing SizeOfAgent class is \n" + "specified in the java's \"-javaagent\" command line argument."); } return inst.getObjectSize(o); } /** * Calculates full size of object iterating over its hierarchy graph. * * @param obj * object to calculate size of * @return object size */ public static long fullSizeOf(Object obj) { MapObject, Object visited = new IdentityHashMapObject, Object(); StackObject stack = new StackObject(); long result = internalSizeOf(obj, stack, visited); while (!stack.isEmpty()) { result += internalSizeOf(stack.pop(), stack, visited); } visited.clear(); return result; } private static boolean skipObject(Object obj, MapObject, Object visited) { if (obj instanceof String) { // skip interned string if (obj == ((String) obj).intern()) { return true; } } return (obj == null) // skip visited object || visited.containsKey(obj); } private static long internalSizeOf(Object obj, StackObject stack, MapObject, Object visited) { if (skipObject(obj, visited)) { return 0; } visited.put(obj, null); long result = 0; // get size of object + primitive variables + member pointers result += SizeOfAgent.sizeOf(obj); // process all array elements Class clazz = obj.getClass(); if (clazz.isArray()) { if (clazz.getName().length() != 2) {// skip primitive type array int length = Array.getLength(obj); for (int i = 0; i length; i++) { stack.add(Array.get(obj, i)); } } return result; } // process all fields of the object while (clazz != null) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i fields.length; i++) { if (!Modifier.isStatic(fields[i].getModifiers())) { if (fields[i].getType().isPrimitive()) { continue; // skip primitive fields } else { fields[i].setAccessible(true); try { // objects to be estimated are put to stack Object objectToAdd = fields[i].get(obj); if (objectToAdd != null) { stack.add(objectToAdd); } } catch (IllegalAccessException ex) { assert false; } } } } clazz = clazz.getSuperclass(); } return result; } } 然后我们可以做一个测试: public class Test { static class Person{ private int id; private String name; private String address; public Person(int id, String name, String address) { this.id = id; this.name = name; this.address = address; } } public static void main(String[] args) throws Exception { Person p = new Person(12, "xujsh","bj"); long size = SizeOfAgent.fullSizeOf(p); System.out.println(size); } } 切换到命令行: D:\workspace\objsize\srcjava -version java version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing) D:\workspace\objsize\srcjavac com/bj58/test/*.java D:\workspace\objsize\srcjar -cvfm size.jar MANIFEST.MF com/bj58/test/* 标明清单(manifest) 增加:com/bj58/test/SizeOfAgent.class(读入= 3119) (写出= 1698)(压缩了 45%) 增加:com/bj58/test/SizeOfAgent.java(读入= 3147) (写出= 1204)(压缩了 61%) 增加:com/bj58/test/Test$Person.class(读入= 442) (写出= 305)(压缩了 30%) 增加:com/bj58/test/Test.class(读入= 692) (写出= 441)(压缩了 36%) 增加:com/bj58/test/Test.java(读入= 509) (写出= 290)(压缩了 43%) D:\workspace\objsize\srcjava -javaagent:size.jar com.bj58.test.Test 24 MANIFEST.MF: Manifest-Version: 1.0 Main-Class: com.bj58.test.Test Premain-Class: com.bj58.test.SizeOfAgent Boot-Class-Path: Can-Redefine-Classes: false 【注意】MANIFEST.MF文件的格式要求比较严格,每一行要满足:key:空格value回车 如何在web应用程序里面使用呢?
用Java怎么测试一个对象所占的内存的大小?
这是一个测试的方法,参考网上的,具体可以看提供给你的网址
package com;
public class Sizeof {
public static void main(String[] args) throws Exception {
// Warm up all classes/methods we will use
runGC();
usedMemory();
// Array to keep strong references to allocated objects
final int count = 100000;
Object[] objects = new Object[count];
long heap1 = 0;
// Allocate count+1 objects, discard the first one
for (int i = -1; i count; ++i) {
Object object = null;
// Instantiate your data here and assign it to object
object = new Object();
// object = new Integer (i);
// object = new Long (i);
// object = new String ();
// object = new byte [128][1]
if (i = 0)
objects[i] = object;
else {
object = null; // Discard the warm up object
runGC();
heap1 = usedMemory(); // Take a before heap snapshot
}
}
runGC();
long heap2 = usedMemory(); // Take an after heap snapshot:
final int size = Math.round(((float) (heap2 - heap1)) / count);
System.out.println("'before' heap: " + heap1 + ", 'after' heap: "
+ heap2);
System.out.println("heap delta: " + (heap2 - heap1) + ", {"
+ objects[0].getClass() + "} size = " + size + " bytes");
for (int i = 0; i count; ++i)
objects[i] = null;
objects = null;
}
private static void runGC() throws Exception {
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r 4; ++r)
_runGC();
}
private static void _runGC() throws Exception {
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 usedMem2) (i 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
private static final Runtime s_runtime = Runtime.getRuntime();
}
如何计算Java对象所占内存的大小
java中可以用.getBytes().length获取字符串占用内容的大小,原理是java中任何字符都采用Unicode编码,所以衡量占用内存大小采用占用的字节数。
举例如下:
public
class
TestStringSize
{
public
static
final
void
main(String[]
args)
{
System.out.println("占用内存大小:"+"学java".getBytes().length);
}
}
输出结果:
占用内存大小:6
byte
java对象内存大小统计的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java对象内存分析、java对象内存大小统计的信息别忘了在本站进行查找喔。
发布于:2022-11-22,除非注明,否则均为
原创文章,转载请注明出处。