`
liuxinglanyue
  • 浏览: 557331 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

计算Java对象占用内存空间的大小(对于32位虚拟机而言)

    博客分类:
  • JVM
阅读更多

参考文档:http://liuxinglanyue.iteye.com/blog/855907

http://www.developersky.net/thread-97-1-1.html

 

Sizeof.java

 

package com.liuxinglanyue;

public class Sizeof
{
    public static void runGC () throws Exception
    {
        for (int r = 0; r < 4; ++ r) 
        	_runGC ();
    }
    public 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 ();
        }
    }
    public static long usedMemory ()
    {
        return s_runtime.totalMemory () - s_runtime.freeMemory ();
    }
    public static final Runtime s_runtime = Runtime.getRuntime ();
}

 Lang.java

 

package com.liuxinglanyue;

public class Lang 
{
	public static void main(String []args) throws Exception
	{
		Sizeof.runGC ();
		Sizeof.usedMemory ();
		long heap1 = Sizeof.usedMemory ();
		Te te = new Te();
		Sizeof.runGC();
		long heap2 = Sizeof.usedMemory();
		int size = Math.round ((float)(heap2 - heap1));
		System.out.println ("'before' heap: " + heap1 + ", 'after' heap: " + heap2);
		System.out.println ("heap delta: " + (heap2 - heap1));
		System.out.println("size = " + size + " bytes");
	}
}
class Te 
{
	int i;
//	boolean flag;
//	Object obj;
	Integer k;
}

 运行结果:

 

'before' heap: 137456, 'after' heap: 137472
heap delta: 16
size = 16 bytes
分享到:
评论
1 楼 liuxinglanyue 2014-12-02  
四年后的自己

这种方法 不靠谱。

使用javaagent的方式。
推荐两个工具 jol 、 Classmexer

相关推荐

    Java占用内存的研究.pdf

    总结而言,本文档提供了一个深入的分析,帮助读者理解在Java编程中,不同数据类型和结构所占用的内存大小。这不仅可以帮助开发者更好地优化应用程序的内存使用,避免内存泄漏,而且对性能调优也有非常重要的参考价值...

    java内存对象分配过程研究

    一般而言,对象在内存中的布局可以分为三个部分: 1. **对象头(Object Header)**:存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄(Age)等信息。这部分数据的长度并不固定,但至少会占用8字节(在64位...

    java虚拟机各种版本

    对于开发者而言,理解JVM的工作原理和调优技术,能帮助他们编写出更高效、更稳定的代码。 总之,Java虚拟机是Java生态系统中的核心组件,它的多样性满足了不同场景的需求,而深入理解和掌握JVM的工作原理,是每个...

    深入java虚拟机

    垃圾回收机制是JVM内存管理的一个重要部分,它负责回收不再使用的对象所占用的内存空间,以避免内存泄露。 JVM的架构设计为Java程序提供了一个“一次编写,到处运行”的平台。它主要包括以下几个关键组件: 1. 类...

    如何设置Tomcat的JVM虚拟机内存大小

    一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要。 在 Windows 下,可以在文件 /bin/catalina.bat 中增加如下设置:JAVA_OPTS='-Xms【初始化...

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中...对于希望提升Java应用性能的开发者而言,深入研究JVM的每一个细节都是值得的。通过本书的学习,开发者可以更好地掌握JVM的工作原理,为编写高性能的Java应用程序打下坚实的基础。

    Java中堆内存和栈内存详解

    - **垃圾回收**:Java虚拟机(JVM)会自动管理堆内存,通过垃圾回收机制(Garbage Collection, GC)来回收不再被引用的对象所占用的空间。 #### 四、内存分配策略 Java的内存分配策略主要包括静态分配、栈式分配和...

    2024年java面试题-jvm之java虚拟机面试题

    ### 2024年Java面试题:JVM之Java虚拟机面试题 #### Java内存模型及基础知识 **1. Java代码如何被计算机识别** Java程序最初由开发人员使用Java语法...对于求职者而言,熟练掌握这些知识点有助于在面试中脱颖而出。

    深入Java核心 Java内存分配原理精讲(对于没有接触过java内存的程序员很有用)

    Java内存分配是理解Java运行机制的关键部分,尤其对于初学者而言,掌握这一原理能显著提升编程效率和代码质量。Java内存分配涉及多个区域,包括栈、堆、常量池等,每个区域都有其独特的功能和适用场景。 ### 一、...

    java虚拟机的原理!

    对于Java开发者而言,了解Java虚拟机的基本工作原理是非常必要的: 1. **Java开发者**:无论是对于刚入门的新手还是有经验的开发者来说,深入理解Java虚拟机的工作机制都是很有价值的。 2. **对Java有兴趣的人群**...

    一套完整介绍java内存模型和内存结构的文档

    ### Java内存模型与内存结构详解 #### 一、引言 在深入了解Java内存模型与内存结构之前,我们首先...理解这些内存区域对于深入学习Java编程至关重要,尤其是对于那些希望优化程序性能或解决复杂问题的开发者而言。

    计算机JAVA语言入门

    - Java的实时性支持虽然不如C++强大,但对于大多数应用而言已经足够。 - Java通过优化垃圾回收机制等方式来提高实时性能。 - **1.2.11 Java的状态管理** - Java在状态管理方面优于C++,因为它提供了一种更简洁的...

    基于嵌入式Java虚拟机的垃圾收集优化算法应用.pdf

    垃圾收集是Java虚拟机中的一个关键功能,它能够自动管理内存,回收不再使用的对象占用的内存空间。然而,不当的垃圾收集算法会导致应用性能降低,尤其是在内存受限的嵌入式系统中。 本论文聚焦于嵌入式Java虚拟机中...

    java虚拟机(WINCE)

    Java虚拟机(JVM,Java Virtual Machine)是Java平台的核心组成部分,它负责解析和执行Java字节码,使得Java程序可以在任何...对于开发者而言,理解和掌握这些知识点对于在WINCE上成功部署和运行Java应用程序至关重要。

    基于Java虚拟机内存模型的性能调优方法.pdf

    根据这些指标,可以采取不同的调优策略,如调整堆内存大小、使用不同的垃圾回收器、优化代码减少对象创建等。 通常,调优工作会依赖于特定的性能分析工具,这些工具可以监控JVM的运行状态,提供内存使用情况的详细...

Global site tag (gtag.js) - Google Analytics