Java中对象的内存分配机制

简介: Java中对象的内存分配机制

一、内存划分


Java把内存划分为两种,一种是栈内存,另一种是堆内存


1、栈内存


在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。


2、堆内存


堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java中的自动垃圾回收器来管理。


3、栈和堆的之间的关系


在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的值等于数组或对象在堆内存中的首地址,栈中的这个变量就变成了数组或对象的引用变量。引用变量就相当于是为数组或对象定义一个名词,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。


说明:引用变量就是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行带使用new产生数组和对象的语句所在的代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它时,如引用变量x=null,才变成垃圾,不能在被使用,但是仍然占着内存,在随后的一个不明确的时间,被垃圾回收器释放掉。这个也是Java占内存较多的主要原因。


二、对象在内存中的分布


在Java语言中,要创建新的对象,需要使用new关键字和对象的类名,如Person p1 = new Person();。等号左边以类名Person作为变量类型,定义了一个变量p1,p1指向等号右边通new关键字所创建一个Person类的实例对象,变量p1就是对象的引用句柄,对象的应用句柄是在栈中分配的一个变量,对象本身是在堆中分配的。


image.png


变量在被初始化之前是不能使用的,在一个方法内部的变量必须进行初始化赋值,否则会出现编译无法通过的情况。当一个对象被创建时,会对其中各种类型的成员变量。按照如表所示自动进行初始化赋值。除了基本类型之外的变量类型都是引用类型。如上列的Person及数组。

39.png

所以,对象内存状态图中的 age 成员变量的初始值为0。

创健新的为最之后,概可以使用“ 对象名.对象成员” 的格式来访间对象的成员(包括属性和方法),Porson类对象的产生和使用方式见示例1.1。

public class TestPerson {
  public static void main(String[] args) {
    Person = p1 = Person();
    Person = p2 = Person();
    p1.age = - 30;
    p1.shout();
    p2.shout();
  }
}



相关文章
|
11天前
|
Java 数据库连接 开发者
Java的Shutdown Hook机制:优雅地关闭应用程序
Java的Shutdown Hook机制:优雅地关闭应用程序
18 1
|
4天前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
14 3
|
4天前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
4天前
|
算法 程序员 调度
深入理解操作系统的内存管理机制
【5月更文挑战第9天】 在现代计算机系统中,操作系统的内存管理是一个至关重要的部分,它直接影响到系统的性能和稳定性。本文将深入探讨操作系统的内存管理机制,包括物理内存的管理、虚拟内存的概念和应用,以及内存分配和回收的策略。通过对这些内容的深入理解,我们可以更好地理解操作系统的工作原理,提高我们的编程效率和质量。
|
1天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
15 4
|
3天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
3天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
3天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
12 3
|
3天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
11 1
|
4天前
|
算法 安全 UED
深入理解操作系统的内存管理机制
【5月更文挑战第9天】 在本文中,我们将探讨操作系统的核心组件之一——内存管理。不同于传统的摘要概述,我们将直接切入主题,首先介绍内存管理的基础知识,然后深入讨论操作系统如何处理内存分配、内存保护以及虚拟内存技术。通过分析具体实例和案例研究,文章旨在为读者提供一个清晰的框架,以理解内存管理在现代操作系统中的实现和重要性。
4 0