`

JVM概念之Java对象的大小与引用类型

    博客分类:
  • JVM
 
阅读更多

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

  1. Object ob = new Object(); 

这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

  1. Class NewObject {  
  2. int count;  
  3. boolean flag;  
  4. Object ob;  

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

 

这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

 

引用类型

对象引用类型分为强引用、软引用、弱引用和虚引用。

强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收

软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。

强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。

分享到:
评论

相关推荐

    Java JVM Instruction Set

    这有助于更深入地理解JVM如何处理不同类型的对象引用和方法分派。 综上所述,Java虚拟机指令集是Java程序执行的关键组成部分。通过深入研究JVM的工作原理和指令集,可以帮助我们更好地理解和优化Java程序的性能。

    java jvm调优浅谈

    Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,...因为 Java 中没有指针的概念,程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传递对象本身。

    Java虚拟机(JVM)面试题 51道.pdf

    Java虚拟机(JVM)是Java语言的核心组成部分,它为Java程序提供了一个跨平台的运行环境。...以上是Java虚拟机(JVM)的关键概念和工作原理,理解这些知识点对于Java开发者来说至关重要,特别是在面试和解决性能问题时。

    实战JAVA虚拟机 JVM故障诊断与性能优化.rar

    综上所述,《实战JAVA虚拟机 JVM故障诊断与性能优化》涵盖了JVM的各个方面,从基本概念到高级技巧,从故障排查到性能调优,是Java开发者的必备参考资料。通过深入学习,开发者不仅能提升自己的技术水平,还能更好地...

    Java 对象(数组)占多大空间(几个字节) 手把手做实验

    总之,Java对象和数组的内存占用取决于JVM的配置、对象的字段、数组的元素类型和长度等因素。开启或关闭压缩选项会影响对象和数组引用的大小,进而影响整体的内存占用。对于内存优化和性能调优来说,了解这些细节至...

    Java之基本数据类型 Sizeof 大小

    在`clazzSize`这个文件名中,我们可以推测这可能是一个与类或者对象大小相关的资源,可能包含了不同数据类型实例化后的内存占用情况。通过分析这样的数据,我们可以更深入地理解Java内存模型,并优化我们的代码以...

    java对象创建过程

    ### Java对象创建过程详解 在Java编程语言中,对象是程序的基本单元,一切皆对象这一概念使得Java在面向对象编程领域具有重要的地位。本文将详细阐述Java对象的创建过程,帮助读者深入理解Java基础。 #### 一、类...

    JVM调优与JAVA内存管理总结.docx

    Java虚拟机(JVM)调优与Java内存管理是Java应用程序高效运行的关键环节。JVM内存主要分为堆(Heap)和非堆(Non-Heap)两部分,堆中又细分为年轻代(Young)、年老代(Tenured)和持久代(Perm),非堆主要包含方法...

    java与jvm知识总结

    Java与JVM(Java虚拟机)是Java编程语言的核心组成部分,它们之间紧密相连,共同构成了Java应用程序的运行环境。理解这两个概念对于Java开发者至关重要。本文将深入探讨Java类加载机制以及JVM的工作原理。 首先,让...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    ### 深层解析Java虚拟机中的栈与堆:对象的内存分布 #### 核心概念:栈与堆的本质及作用 在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆...

    JVM详解与学习

    ### JVM详解与学习 #### Java相关 ##### 1.1 Java定义 Java 是一种广泛使用的高级编程语言,具有面向对象、跨平台等特性。它的设计理念是“一次编写,到处运行”,这得益于Java虚拟机(JVM)的存在。JVM使得Java...

    jvm 启动过程 JVM 原理

    JVM是Java Virtual Machine的缩写,它是Java平台的核心组件之一。它的主要任务是将编译后的Java类文件(.class文件)中的字节码转换为特定平台的机器码,实现了Java的“一次编写,到处运行”的跨平台特性。JVM由多个...

    java内存对象分配过程研究

    3. **对齐填充(Padding)**:由于虚拟机要求对象起始地址必须是8字节的整数倍,填充是为了让对象大小符合这一要求而存在的。 #### 五、对象初始化过程 对象初始化是构造对象的最后一步,它包括以下几个方面: 1. *...

    Java中的JVM基础-数据类型和堆栈_.docx

    在Java中,一个线程就会相应有一个线程栈与之对应,这点很简单理解,由于不同的线程执行规律有所不同,因此需要一个独立的线程栈。而堆则是全部线程共享的。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗...

    JVM调优.pdf

    本文将基于提供的资料,深入探讨JVM调优的相关知识,包括数据类型的基本概念、堆与栈的区别及其对性能的影响,并重点讨论参数调优策略。 #### 二、数据类型 在Java虚拟机中,数据类型主要分为两大类:基本类型和...

    java JVM详解

    ### Java Virtual Machine (JVM) 详析 #### 一、Java相关 ##### 1.1 Java 定义 Java 是一种广泛使用的面向对象的高级编程语言,它由 Sun Microsystems 在 1995 年发布。Java 设计初衷是为了满足分布式计算环境的...

    java虚拟机

    5. **JVM性能调优**:通过监控和调整JVM的各项参数,如堆大小、新生代与老年代的比例、垃圾收集器的选择等,可以优化程序的运行效率。 6. **JVM内存模型**:Java内存模型(JMM,Java Memory Model)定义了线程如何...

    JVM思维导图(包含所有JVM知识)

    - **对象创建与内存分配**:JVM根据对象大小和生命周期将其分配到堆内存的不同区域。小对象通常在Eden区创建,大对象直接进入老年代。对象的大小包括对象头、实例数据和对齐填充。 - **指针压缩**:在64位JVM中,-...

    原创-JVM调优

    将堆和栈分离,可以实现更好的内存管理和性能优化,比如多线程共享数据、动态对象大小调整等。 堆中存储的是对象,而栈中存储基本数据类型和对堆中对象的引用。一个对象在堆中的大小是可变的,而栈中仅保存对象的4...

Global site tag (gtag.js) - Google Analytics