`

Java与C++内存回收机制的差别

阅读更多

大家知道, Java 除了那 8 种基本类型以外,其他都是对象类型(又称为引用类型)的数据。 JVM 会把程序创建的对象存放在堆空间中,那什么又是堆空间呢?其实,堆( Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆( Heap)和堆栈( Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这两种存储区。一般来说,栈中存放的是非 static 的自动变量、函数参数、表达式的临时结果和函数返回值(如果他们没有被放到寄存器中)。栈中的这些实体数据的分配和释放均是由系统自动完成的,堆中存放的实体数据都是程序中显式分配的,没有自动垃圾回收机制的系统中必须由程序代码显式地释放这些实体。堆的管理,不同的语言实现是不同的。如 C 语言就没有把堆的分配和释放做到语言的层次,它对堆空间对象的操作是通过其库函数 malloc()和 free()来实现的;而 C++直接把对堆空间中的对象的分配和释放做到语言层次了。使用 new 和 delete 语句, Java 就做得更彻底,应用开发者只要在需要用堆分配的时候创建就行了,何时释放如何释放,都有 Java 虚机( JVM)来做,而不需要程序代码来显式地释放。

注;大多数 JVM都实现了自动垃圾回收机制,只是它们各自的实现算法不同。

 

JVM 有着各种版本的实现,它们基本上都会有垃圾回收的机制,也就是堆内存的管理的自动进行。那么,又该如何知道对象已经被回收了呢? Java 中根父类 java.lang.Object 中有个 finalize()方法,它会在垃圾回收器认为这个对象是垃圾的之后,真正回收之前被调用。因为所有的类都继承自 Object,所以它们都会有 finalize()方法。程序员可以在这个方法中写一些需要在对象被回收前做的事情,例如关闭数据库连接


finalize()方法原型如下:

protected void finalize() throws Throwable
一般在调用这个方法之前,垃圾回收器能检测出不再被引用的对象,如果这些对象
盖了 finalize()方法,就要调用该方法。

分享到:
评论

相关推荐

    Java的内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由...

    C++和java作为编程语言的区别解析,用C++开发益智游戏代码的过程说明.docx

    Java具有垃圾回收机制,它自动管理内存,因此程序员不需要担心内存管理问题。 最后,C++支持多重继承,这意味着一个类可以从多个父类继承属性和方法。Java不支持多重继承,但支持接口,这是一种类似于多重继承的...

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...

    关于C++为什么不加入垃圾回收机制解析

    在本文中,我并不想揭露Java提供的垃圾回收机制的天生缺陷,而是指出了C++中引入垃圾回收的可行性。请读者注意,这里介绍的方法更多的是基于当前标准和库设计的角度,而不是要求修改语言定义或者扩展编译器。 什么是...

    java内存泄漏

    也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道GC在什么时候回收内存对象,什么样的内存对象会被GC认为是“不再使用”的。  Java中对内存...

    C++为什么不加入垃圾回收机制?

     在本文中,我并不想揭露Java提供的垃圾回收机制的天生缺陷,而是指出了C++中引入垃圾回收的可行性。请读者注意,这里介绍的方法更多的是基于当前标准和库设计的角度,而不是要求修改语言定义或者扩展编译器。  ...

    牛客网BAT算法练习题答案,包括JAVA和C++两个版本,代码中附上大量注释帮助理解程序.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    计算机Java、网络面试资料

    Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念...

    《剑指 Offer》 Python, Java, C++ 解题代码,LeetBook《图解算法数据结构》配套代码仓.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    C++为什么不加入垃圾回收机制

    在本文中,我并不想揭露Java提供的垃圾回收机制的天生缺陷,而是指出了C++中引入垃圾回收的可行性。请读者注意,这里介绍的方法更多的是基于当前标准和库设计的角度,而不是要求修改语言定义或者扩展编译器。作为...

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    牛客网BAT算法精品课练习题答案,包括JAVA和C++两个版本,代码中附上大量注释帮助理解程序.zip

    健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...

    学习数据结构与算法的代码示例,目前提供 Java、Python、Go、C++ 多种语言支持。.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    JAVA 面试宝典

    Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的...

    Java系统中内存泄漏测试方法的研究

    由于采用垃圾回收机制,Java语言的内存泄漏的模式与C++等语言相比有很大的不同。全文通过与C++中的内存泄漏问题进行对比,讲述了Java内存泄漏的基本原理,以及如何借助Optimizeitprofiler工具来测试内存泄漏和分析...

    棋牌的胡牌算法。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java虚拟机内存优化实践

    众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露...

    包括Java,Python,Linux,Go,C,C++,数据结构与算法,人工智能,计算机基础,面试.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

Global site tag (gtag.js) - Google Analytics