Java中对象几种类型的内存分配(JVM对象储存机制)

简介: Java中对象几种类型的内存分配(JVM对象储存机制)
对象的内存分配—

堆内存:所有使用new关键字创建的对象都在堆内存中

存储对象的变量p(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法。


当Java程序执行时:

  1. 根据Java程序相关的操作会在内存区域进行空间开辟[栈、堆、方法区]
  2. JVM会向内存申请一块区域进行执行程序
  3. 当第一次使用某个类的时候,就会把这个类的字节码文件加载到放去中
  4. 当调用某个方法时,该方法就会被加载到栈区中,开辟一块新的空间来执行该
  5. 凡是new关键字创建的都会在堆中开辟一段新的空间
  6. 系统中栈空间是无需程序猿进行管理的,因为系统会自动对栈中空间进行回收处理
  7. 引用类型在堆中创建了空间之后,不由系统进行空间回收操作,Java中有一套专门针对堆空间回收操作----叫做GC,GC进行回收时是根据栈中不在引用堆中地址,就进行回收操作[null]
1 单个对象在内存中存储
代码示例
package Task;
public class Student {
    String name;//姓名
    int age;//年龄
    //行为  学习
    public void study(){
        System.out.println("正在努力的学习Java......");
    }
}
//==============================================================================
package Task;
public class StudentTest {
    public static void main(String[] args) {
        //1. 创建Student类的对象
        Student xiaoming = new Student();
        //2. 利用学生对象打印成员变量的值
        System.out.println("姓名:"+xiaoming.name);    //姓名:null
        System.out.println("年龄:"+xiaoming.age);     //年龄:0
        //3. 利用学生对象对成员变量进行赋值操作
        xiaoming.name = "小明";
        xiaoming.age = 18;
        System.out.println("姓名:"+xiaoming.name);    //姓名:小明
        System.out.println("年龄:"+xiaoming.age);     //年龄:18
        //打印学生对象
        /*
        打印学生对象方式 ---> Task.Student@1218025c --> 理解为学生对象地址【在堆中地址】
        Task---->包名
        Student ---> 证明xiaoming这个对象时属于Student类的
        @ ---> 没有任何意义就是一个连接符号
        1218025c ---> 学生对象记录的堆中开辟空间地址
        */
        System.out.println("学生对象:"+xiaoming);   //学生对象:Task.Student@1218025c
    }
}


图像展示
单个对象在内存中储存

image.png

总结:
  • 只要是创建对象【使用new关键字】,就会在堆中开辟一段空间
  • 只要调用方法,就会在栈中开辟一段空间,用来执行该方法
  • 栈中空间是系统回收操作,堆中空间是Java提供GC【垃圾回收机制】进行回收操作
  • 多个对象在内存中存储
2 多个对象在内存中存储
代码示例
public class StudentTest2 {
    public static void main(String[] args) {
        //1. 创建Student类的对象
        Student xiaoming = new Student();
        //2. 利用学生对象打印成员变量的值
        System.out.println("姓名:"+xiaoming.name);
        System.out.println("年龄:"+xiaoming.age);
        //3. 利用学生对象对成员变量进行赋值操作
        xiaoming.name = "小明";
        xiaoming.age = 18;
        System.out.println("姓名:"+xiaoming.name);
        System.out.println("年龄:"+xiaoming.age);
        System.out.println("学生对象:"+xiaoming);   //学生对象:Task.Student@816f27d
        xiaoming.study();       //正在努力的学习Java......
        //在利用Student类创建一个xiaohong对象,并访问成员变量
        Student xiaohong = new Student();
        System.out.println("姓名:"+xiaohong.name);    //姓名:null
        System.out.println("年龄:"+xiaohong.age);     //年龄:0
    }
}

图像展示
多个对象在内存中存储

image.png

总结:
  • 一个类是可以创建多个对象的,多个对象在堆中存储,都有不同内存划分【就是多个对象都使用new关键字创建】,成员变量是存储在各自的内存区域中,成员方法是多个对象共一份【类文件只有一个】
  • 凡是使用new关键字创建的对象都会在堆中开辟一段新的存储空间
  • 对象和对象之的关系是相互独立的【只要是使用new关键字创建出来】
3 多个对象指向同一个对象在内存那种存储
代码示例
package Task;
public class StudentTest3 {
    public static void main(String[] args) {
        //1. 创建Student类的对象
        Student xiaoming = new Student();
        //2. 利用学生对象打印成员变量的值
        System.out.println("姓名:"+xiaoming.name);
        System.out.println("年龄:"+xiaoming.age);
        //3. 利用学生对象对成员变量进行赋值操作
        xiaoming.name = "小明";
        xiaoming.age = 18;
        System.out.println("姓名:"+xiaoming.name);
        System.out.println("年龄:"+xiaoming.age);
        System.out.println("学生对象:"+xiaoming);   //学生对象:Task.Student@816f27d
        xiaoming.study();       //正在努力的学习Java......
        //在利用Student类创建一个xiaohong对象,并访问成员变量
        //不在使用Student类创建对象,而是使用创建xiaoming对象对另外一个xiaohong对象进行赋值
        Student xiaohong = xiaoming;
        System.out.println("姓名:"+xiaohong.name);  //姓名:小明
        System.out.println("年龄:"+xiaohong.age);  //年龄:18
    }
}


图像展示
多个对象指向同一个对象在内存那种存储

image.png

总结:
  • 当多个对象的引用指向同一个内存空间时【对象所记录地址都是一样的】,只要有任何一个对象修改了内存中数据,随之无论使用哪一个对象进行数据获取,都是修改之后的数据
  • 当创建多个对象时,如果你需要某个对象与另外一个对象的空间是一致,只需要将其中创建好的对象存储空间地址赋值给另外一个对象即可,此时引用就是同一个空间
  • 当创建多个对象时,需要对象彼此之间互相独立不干扰,只需使用new关键字分别创建即可, 就可以在堆中开辟不同存储空间了


目录
相关文章
|
29天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
31 0
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
40 0
|
1月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
39 8
|
29天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
30天前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
41 3
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
1月前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11天前
|
缓存 Java
JVM对象引用
本次课程聚焦JVM对象引用,涵盖强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,确保对象不会被垃圾回收器回收,适用于需要确保对象存活的场景;软引用在内存不足时会被优先回收,常用于缓存;弱引用的对象随时可能被回收,适合临时对象;虚引用最弱,主要用于接收对象回收通知,进行资源清理。通过合理选择引用类型,可优化内存管理,避免内存泄露。

热门文章

最新文章