「java对象内存大小统计」java对象内存分析

博主:adminadmin 2022-11-22 22:45:07 79

本篇文章给大家谈谈java对象内存大小统计,以及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对象内存大小统计的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-22,除非注明,否则均为首码项目网原创文章,转载请注明出处。