首页 > 系统相关 >java-对象在内存的运行机制

java-对象在内存的运行机制

时间:2023-05-03 19:45:41浏览次数:48  
标签:垃圾 Java 对象 内存 运行机制 java 属性 引用

面向对象

Java 是一种面向对象的编程语言。在 Java 中,一切都是对象,每个对象都有一组属性和方法。通过类来定义对象的属性和方法,一个类可以创建多个对象,每个对象都具有相同的属性和方法,但是它们的属性值可以不同。

Java中的面向对象编程主要包括以下几个方面:

  1. 封装:将对象的属性和方法封装在一起,通过访问控制修饰符(public、private、protected)来限制对属性和方法的访问,从而保证数据的安全性和一致性。
  2. 继承:通过继承,子类可以继承父类的属性和方法,并可以添加自己的属性和方法,实现代码的复用和层次化设计。
  3. 多态:Java中的多态指的是同一个方法可以根据不同的对象调用出不同的行为。Java中的多态主要包括方法重载和方法重写。
  4. 抽象:抽象是将对象的共同特征提取出来,形成抽象类或接口,从而达到代码复用的目的。

面向对象编程使得程序的设计更加灵活和可维护性更高,使得代码更加易于扩展和重用。

对象在内存中的运行机制

对象在内存中的运行机制可以分为两个方面,即对象的创建和对象的销毁。

对象的创建

  • 在堆内存中为对象分配一块内存空间。
  • 分配内存后,调用该对象的构造方法进行对象的初始化,例如对象的属性赋值。
  • 对象初始化后,返回该对象的引用,通过引用来访问对象的方法和属性

对象的销毁

对象不再被引用时,会触发Java虚拟机中的垃圾回收机制进行对象的销毁。垃圾回收机制会对所有不再被引用的对象进行标记,并将这些对象的内存空间释放回堆内存中,以供其他对象使用。

虚拟机中的垃圾回收机制采用的是自动化的方式,程序员不需要手动管理内存,这种机制使得Java程序的编写更加简单和安全。

对象引用是一个指向对象内存地址的指针,当对象引用被赋值为null时,表示该引用不再指向任何对象,这也是Java中的一种常用的对象销毁方式。

如何判断对象不再被引用

判断一个对象是否不再被引用有两种方法:

  1. 引用计数法

引用计数法是一种最简单的垃圾回收算法。它的基本思路是给每个对象记录一个引用计数器,每当有一个新的引用指向该对象时,计数器就加一,当引用失效时,计数器就减一。当计数器为0时,表示该对象不再被引用,可以被回收。

但是引用计数法有一个致命的缺点,就是无法处理循环引用的情况。当两个对象相互引用时,它们的引用计数器永远不会为0,导致这些对象无法被垃圾回收,从而出现内存泄漏的问题。

Java虚拟机并没有采用引用计数法来进行垃圾回收。

  1. 可达性分析法

Java虚拟机采用的是可达性分析法来进行垃圾回收。它的基本思路是通过一些根节点来寻找所有的存活对象。根节点包括虚拟机栈中引用的对象、类静态属性引用的对象和常量引用的对象。

可以把Java中所有的对象看作是一个有向图,图中每个节点表示一个对象,每个引用表示一条有向边,指向被引用的对象。通过这个图,可以找到所有被根节点所引用的对象,将这些对象标记为存活对象,而没有被标记的对象就是垃圾对象。从这些根节点开始,通过引用链遍历所有的对象图,将所有被遍历到的对象标记为存活对象,没有被标记的对象即为垃圾对象。

在示意图中,存在三个垃圾对象:F、G、H。这些垃圾对象没有被任何根节点引用,也不会被遍历到,因此它们将会被垃圾回收器回收。
因此存活对象为:A、B、C、D、E;垃圾对象为:F、G、H。

【总结】:可达性分析法可以解决循环引用的问题,因为Java虚拟机可以检测到对象之间的引用关系,从而避免出现内存泄漏的问题。

标签:垃圾,Java,对象,内存,运行机制,java,属性,引用
From: https://www.cnblogs.com/usrobject/p/17368870.html

相关文章

  • 为什么显卡的显存是1G 3G 6G 11G 22G 是奇数的倍数,而内存条是4G 8G 16G 32G 是偶数的
    为什么显卡的显存是1G3G6G11G22G是奇数的倍数,而内存条是4G8G16G32G是偶数的倍数  GPT4:显卡的显存和内存条的容量之所以有这种差异,主要原因是它们的设计和使用场景不同。内存条(RAM)通常使用二进制存储数据,因此其容量通常是2的整数次幂(如2、4、8、16、32等......
  • volatility 3 内存取证入门——如何从内存中寻找敏感数据
    volatility3内存取证入门——如何从内存中寻找敏感数据   上面说的思路,我自己在本机验证下,首先,我在虚拟机里使用IE登录我的qq邮箱,如下: 我自己登录IE的进程是2052,虚拟机dumpvmem文件以后,vol3下:python.\vol.py-f"D:\VirtualMachines\Windows10x641809\Win......
  • JAVA中的数组详解
    JAVA中的数组二维数组的静态初始化格式:数据类型[][]数组名=new数据类型[][]{{},{},{}};简化:数据类型[][]数组名={{元素1,元素2},{元素1,元素2},{元素1,元素2}};int[][]arr={{11,22},{11,22}}; 动态初始化格式:数据类型[][]数组名=new数据类型[m]......
  • 关于Java栈与堆的思考
    关于Java栈与堆的思考2009-03-2821:00:02      2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译......
  • java 线程分类-守护线程
    java线程分类-守护线程2009-03-1117:32:57| java线程分类-守护线程  守护线程(Daemon)Java有两种Thread:“守护线程Daemon”与“用户线程User”。我们之前看到的例子都是用户,守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。从字面上我们很容易将守护线程......
  • java 栈的实现
    栈可以说是一种特殊的链表,它的主要特点是先进后出,是一种重要的数据结构,广泛应用于我们的编程之中,例如多项式求值、平衡输入和方法的调用等。实现代码如下所示:40packagecom.suznhenxing;publicclassStack{privateinttop=-1;//栈顶指针privateObject[]items;//栈中的......
  • Java名字的由来
       Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果。   Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序,如:机顶盒、公交卡,Sun公司万万没想到Java会引来这么多的企业关注,所以又继续往网络编......
  • 关于java中的多态和对实例化对象的一些理解
    java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写。而重写又是依赖着......
  • Java 网络编程 —— 创建多线程服务器
    一个典型的单线程服务器示例如下:while(true){Socketsocket=null;try{//接收客户连接socket=serverSocket.accept();//从socket中获得输入流与输出流,与客户通信...}catch(IOExceptione){e.printStackTr......
  • Java虚拟机之自动内存管理
    1内存区域1.1运行时数据区域运行时数据区域可以划分为由所有线程共享的方法区、堆和线程隔离的虚拟机栈、本地方法栈、程序计数器。1.1.1程序计数器(ProgramCounterRegister)-线程隔离程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器。Java虚拟机......