本文总结了JVM概念中的Java对象的大小,以及三种引用类型的定义与区分。
基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。
在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:
Object ob = new Object();
这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。
有了Object对象的大小,我们就可以计算其他对象的大小了。
Class NewObject {
int count;
boolean flag;
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是一种广泛使用的高级编程语言,以其跨平台、安全性强...总的来说,这些题目覆盖了Java程序设计的基础概念,包括语法、面向对象、数据类型、控制流、数组以及类和对象的使用,是学习和理解Java编程的良好练习材料。
本篇学习笔记将深入探讨Java的基础概念,主要包括初始化、数据类型、对象、变量类型、集合类、泛型、垃圾回收、方法重载与重写以及static关键字。 首先,初始化是程序执行的起点,涉及到变量的分配和设定初始值。在...
- **类**是一种抽象的概念,代表具有共同特性和行为的一组对象。例如,“狗”可以被抽象成一个类,其中包含颜色、年龄、体重等属性以及睡觉、看家、吃食等行为。 - **对象**则是类的一个具体实例。比如,“马路旁...
类类型、接口类型和数组类型是JVM中的三种引用类型。类装载器加载的类会被放置在不同的命名空间,以避免冲突。 总的来说,Java虚拟机通过其独特的设计,实现了平台无关性、安全性和网络移动性,为开发者提供了高效...
本文总结了 Java 语言的基础知识,涵盖了 JDK、JRE、JVM 等概念,类和对象的区别、构造方法和普通方法的区别、作用域的四种类型、Integer 与 int 的区别、&和&&的区别、类变量与实例变量的区别、=="和equals的区别等...
在介绍JDK15版本的Java虚拟机规范之前,需要先理解Java虚拟机(JVM)的基本概念。Java虚拟机是一种抽象的计算机,它提供了一个运行环境,使得Java程序能在不同的硬件和操作系统上以相同的方式运行。JVM规范详细定义...
- **定义**:标记阶段的主要任务是对内存中的所有对象进行标记,区分出哪些对象仍然被引用,哪些对象已经不可达。 - **实现细节**: - IBM JVM采用多种策略来实现高效的标记过程,包括但不限于串行标记、并行标记...
Java基础入门的学习涵盖了一系列关键概念,这里我们详细探讨一下标题和描述中提到的各个章节的知识点。 1. **Java开发入门** - **对象**:Java是一种面向对象的编程语言,一切皆对象,对象是类的实例,包含了数据...
8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的...
在Java编程语言中,我们遇到的核心概念包括JDK、JRE和JVM。JDK(Java Development Kit)是Java开发工具集,包含了JRE(Java Runtime Environment)以及Java编译器,允许开发者编写、编译和调试Java程序。JRE则是Java...
Java是一种广泛使用的高级编程语言,以其跨平台、面向对象、安全性等特性著称。学习Java的基础概念对于理解和掌握Java编程至关重要,无论你是J2SE(Java Standard Edition)、J2EE(Java Enterprise Edition)还是...
三、Java面向对象编程的关键概念 1. 构造函数:构造函数用于初始化新创建的对象,其名称与类名相同且无返回类型。 2. 析构函数:Java没有显式的析构函数,但可以使用 finalize() 方法进行资源清理。 3. 方法重载:...
* 变量:Java 中的变量,包括基本数据类型和引用类型 * 常量:Java 中的常量,例如数字、字符串等 变量 变量是 Java 中的一种基本数据单元,用于存储和操作数据。变量包括: * 变量概念及作用:变量是存储数据的...
年轻代主要用于存放新生的对象,它由Eden和两个Survivor区组成,新生对象首先在Eden区分配内存,当Eden满时,经过垃圾回收未被引用的对象被清除,其余存活的对象被复制到Survivor区。当Survivor区也无法容纳时,这些...
JDK、JRE和JVM三者之间的关系,Java的三大特性,基本数据类型的详细信息,以及在Java中关于变量类型、继承、多态、方法重写重载、抽象类和接口、静态与非静态变量、值传递与引用传递等核心概念的解释和区分。...
基本数据类型有固定的大小和值范围,而引用数据类型指向对象的内存地址。 3.5. 命名规则 Java的命名规则要求标识符遵循驼峰命名法,首字母小写,每个单词首字母大写。常量通常全大写,单词间用下划线分隔。 4. 三...
Java技术的核心是基于Java虚拟机(Java Virtual Machine,JVM)的概念,它作为一种转换器,确保了Java程序能够在任何安装了JVM的系统上无缝运行。JVM的功能就像是一个软件模拟的计算机,能够安全地兼容不同处理器,...
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
这意味着数组可以存储对象引用。 **22. Java中数组元素下标总是从0开始,下标可以使整型或者整型表达式。** - **答案:** 正确 - **解析:** Java数组的索引从0开始计数。下标可以是整数或整数表达式的计算结果。 *...
在Java中,多态性是一个重要的概念,允许子类对象通过父类引用进行操作,从而实现更灵活的代码设计和复用。下面我们将通过具体的例子来探讨Java中的方法匹配原则。 ##### 1.1 动态方法调用 考虑以下代码示例: ``...