`
yan465942872
  • 浏览: 14573 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java和C++的区别以及Java的垃圾回收机制

 
阅读更多

JAVAC++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,摒弃了其他语言的不足之处,从根本上解决了c++的固有缺陷。

Javac++的相似之处多于不同之处,但两种语言有几处主要的不同使得Java更容易学习,并且编程环境更为简单。

我在这里不能完全列出不同之处,仅列出比较显著的区别:

1.指针

JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了cc++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。

2.多重继承

c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。

3.数据类型及类

Java是完全面向对象的语言,所有函数和变量都必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了cc++中的结构和联合,消除了不必要的麻烦。

4.自动内存管理

Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:

Read rnew Read()

r.work()

语句Read rnew Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c十十中必须由程序员释放内存资源,增加了程序设计者的负担。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。

5.操作符重载

Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。

6.预处理功能

Java不支持预处理功能。cc十十在编译过程中都有一个预编泽阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)c十十预处理器的功能类似。

7. Java不支持缺省函数参数,而c十十支持

c中,代码组织在函数中,函数可以访问程序的全局变量。c十十增加了类,提供了类算法,该算法是与类相连的函数,c十十类方法与Java类方法十分相似,然而,由于c十十仍然支持c,所以不能阻止c十十开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。

Java没有函数,作为一个比c十十更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

8 字符串

cc十十不支持字符串变量,在cc十十程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(stringstringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:

(1)在整个系统中建立字符串和访问字符串元素的方法是一致的;

(2)J3阳字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;

(3)Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;

(4)可对字符串用进行连接操作。

9 goto语句

可怕goto语句是cc++遗物,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。

l0.类型转换

cc十十中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在c十十中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c十十中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。

11.异常

JAVA中的异常机制用于捕获例外事件,增强系统容错能力

try{//可能产生例外的代码

}catch(exceptionType name){

//处理

}

其中exceptionType表示异常类型。而C++则没有如此方便的机制。


java的垃圾回收机制对于java体系结构的学习非常重要。这里将阅读的一些文献整理总结出来,记述java的几种垃圾回收算法。

垃圾回收算法有两个基本的问题:1.必须检测到垃圾对象。2.必须重新声明被垃圾对象占用的堆空间并且让堆空间可用。

可达性(reachability

一个对象是可达的,当且仅当从可执行程序的根集开始有引用路径能访问该对象。

根集(roots set

包括:1.局部变量的对象引用,栈元素以及任何类变量的对象引用

2.任何对象引用,如string

3.任何传递给本地方法的对象引用

4.JVM的运行时数据区的任何部分

引用记数(reference counting

这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。

引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被过长中断的实时系统来说有着天然的优势。

但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。

在现代的垃圾回收算法中,引用记数已经不再使用。

追踪算法(tracing

基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象便是需要回收的垃圾。

追踪算法基于标记并清除.这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶段,未标记的对象被释放,并使其在内存中可用。

紧凑算法(compacting

在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧张的JVM内存资源来说是非常不利的。由此出现了紧凑算法。

基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。

拷贝算法(copying

这是另一种针对内存碎片的算法。 基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用内存时,对该区域内存进行标记,并将标 记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当前可用,继续执行该算法。

拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。

分代算法(geneational

针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:

1.被大多数程序创建的大多数对象有着非常短的生存期。

2.被大多数程序创建的部分对象有着非常长的生存期。

简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。

分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每次经过年轻一代的垃圾回收总会有未被收集的活对象,这些活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。

分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许多JVM使用的垃圾回收算法。

适应算法(adaptive

其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。

分享到:
评论

相关推荐

    c++ 垃圾回收机制

    "垃圾回收机制"这个概念在很多高级语言如Java或Python中是非常常见的一种自动内存管理方式,但在C++中,它并不是标准库的一部分。C++的内存管理主要依赖于程序员手动进行,通过new和delete操作符来分配和释放内存。...

    java高级之垃圾回收机制

    本文将详细介绍Java中的垃圾回收机制及其工作原理,并探讨JVM如何管理和优化垃圾回收过程。 #### 二、JVM内存模型 JVM内存模型主要包括永久代(Permanent Generation, PermGen)、堆(Heap)和栈(Stack)三大部分。值得...

    java/c++区别

    Java是从C++的基础上发展而来,继承了C++的一些特性,如继承,但同时也引入了新的概念,如垃圾回收机制,以及更安全的内存管理。 (五) 基本区别 1) **JAVA摒弃的C++内容**:Java不支持指针,以减少内存错误,且没有...

    JAVA与C++的区别

    Java不支持指针,而是使用引用,由垃圾回收机制自动管理内存,提高了安全性和稳定性。 - **内存管理**:C++要求程序员手动分配和释放内存,容易产生内存泄漏或悬挂指针。Java则自动进行内存管理,使用垃圾回收机制...

    The diffenences bwtween Java and C++ (JAVA与C++区别)

    **Java**:Java采用自动化的垃圾回收机制,自动跟踪并释放不再使用的对象所占用的内存空间。这种方式使得Java程序在内存管理方面更加安全可靠。 ##### 总结 C++和Java都是功能强大的编程语言,它们各自拥有独特的...

    JAVA和C++的区别

    JAVA 使用垃圾回收机制来自动清理不再使用的内存,避免了C++中因指针管理不当导致的内存泄漏或系统崩溃问题。这种设计提高了程序的稳定性和安全性,但也可能在某些情况下影响程序性能。 其次,C++支持多重继承,...

    java与C++的区别

    如前所述,Java的垃圾回收机制自动处理不再使用的对象,而C++需要程序员通过new和delete来手动分配和释放内存,这可能导致内存泄漏或悬挂指针的问题。 (四)类型系统 Java有严格的类型检查,所有变量必须预先声明其...

    Java垃圾回收机制

    ### Java垃圾回收机制详解 ...Java的垃圾回收机制是其强大之处之一,它不仅简化了内存管理,还提高了程序的安全性和稳定性。通过对不同垃圾收集算法的理解,我们可以更好地设计和优化Java应用,以满足各种性能需求。

    java垃圾回收机制

    ### Java垃圾回收机制详解 #### 一、垃圾收集的意义及背景 在计算机编程领域,特别是对于内存管理方面,Java提供了一种与C++等其他语言截然不同的方式。在C++中,对象所占用的内存资源需要程序员手动管理,这意味...

    Java转C++代码工具 J2C

    例如,Java的接口在C++中可能表现为抽象类,Java的动态绑定在C++中需要手动实现,而垃圾回收机制则需要转换为手动内存管理。 使用J2C需要注意的是,虽然可以实现代码的转换,但转换后的C++代码可能需要进一步优化和...

    java和c++区别

    Java 和 C++ 的区别 Java 和 C++ 都是面向对象语言,但它们之间有许多区别。 Java 是完全的面向对象语言,它句法更清晰,规模更小,更易学。 C++ 为了照顾大量的 C 语言使用者,而兼容了 C,使得自身仅仅成为了带类...

    面向对象编程C++和Java比较教程

    例如,C++程序员可能需要学习如何避免指针的直接操作,理解Java的垃圾回收机制;Java程序员则需要学会使用C++的模板和内存管理。 总之,C++和Java虽然都是面向对象的语言,但在实现细节和应用领域上有所区别。理解...

    Java垃圾回收机制的学习和使用

    Java垃圾回收机制是Java编程中至关重要的一部分,它自动管理内存,释放不再使用的对象,避免内存泄漏,并优化内存使用。Java虚拟机(JVM)的堆内存是存放对象的主要区域,当对象通过new等指令创建后,垃圾回收机制...

    JAVA和C++区别

    - **JAVA**通过内置的垃圾回收机制自动管理内存,程序员无需手动释放内存资源。这种方式简化了开发过程,减少了内存相关的编程错误。 - **C++**需要程序员手动管理内存,使用`new`和`delete`操作符来分配和释放内存...

    java, c++ 区别

    Java使用自动垃圾回收机制,程序员无需担心内存泄漏。 2. **类型系统**:C++支持静态类型检查,编译期间就能发现类型错误;Java同样采用静态类型,但它的类型系统更加严格,没有裸指针,更安全。 3. **运行效率**:...

    C++代码转java工具

    5. **内存管理**:C++使用手动内存管理,而Java有自动垃圾回收,工具需要处理这两者之间的差异。 6. **函数调用和库集成**:如果C++代码使用了库,工具可能需要处理库的迁移问题,或者提供Java的等价实现。 标签...

    JAVA和C++区别详解

    - JAVA具备自动垃圾回收机制,能够自动识别不再使用的对象并释放其占用的内存空间。相比之下,C++的内存管理依赖于程序员,这虽然可以带来更高的效率,但同时也增加了出错的可能性。 #### 三、跨平台性和数据类型 ...

    C++转换JAVA工具

    这个过程可能涉及到一些挑战,比如C++的模板、指针和运算符重载在Java中的映射,以及Java特有的垃圾回收机制与C++手动内存管理的差异。工具需要确保转换后的代码不仅语法正确,而且能保持原有的功能和性能。 安装...

    Java垃圾回收详解

    综上所述,Java的垃圾回收机制为开发者提供了一个强大而灵活的工具,能够有效减少内存管理方面的负担。然而,理解垃圾回收的基本原理及其工作方式对于优化程序性能至关重要。通过合理运用各种垃圾回收策略和引用类型...

Global site tag (gtag.js) - Google Analytics