Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和处理过程,这里我搜索到一篇差不多内容的论文,这篇论文在内容上讲的很浅,没有深入到源码和内部算法,大致了解一下即可。
 
      在运用面向对象语言编写的程序中,当某些对象不再被引用的时候,内存回收它占领的空间,以便空间能够被后来的新对象所使用,以免造成内存泄露。C++与 Java 是这些年较为流行的面向对象语言,Java是由 C++发展出来的。 内存泄漏一般来讲主要有两种情况:第一种情况是在堆中分配的内存,在没有将其释放的时候,就将能访问这块内存的方式删掉;第二种情况是在内存对象已经不需要的时候,仍旧保留着内存和它的访问方式。 而出现第一种情况多是在 C++中,指针是C++中一种内置的数据类型,且发生的原因是所使用的指针出现了重新赋值的情况;第二种情况多出现在 Java 中,这也是 Java 内存泄露的主要情况。
   垃圾回收机制是一种动态的存储技术,它能够自动释放不再被程序引用的对象,按照特定的垃圾回收算法实现系统资源自动回收的功能。
Java 是一种跨平台,适合于分布式计算环境的纯面向对象编程语言。 在 Java 中,程序员是通过关键字 new 来创建对象以及在堆(Heap)中为对象分配内存空间(基本数据类型除外),而对象的释放是由 GC(Garbage Collection,垃圾回收器)决定和执行的。这种收支两条线在很大程度上简化了程序员的工作, 但 也 加 重 了 JVM (Java VirtualMachine,Java 虚拟机)的工作。 Java 并没有明确指明 JVM 在进行垃圾回收时使用哪种垃圾回收算法,但是不管采用那种垃圾回收算法均要完成发现无用对象并回收被无用对象占用的内存空间的功能。 Java 中对内存对象的访问采用的是引用方式,当 GC 跟踪到某个对象没有被
任何线程访问时,该对象就要被删除,就将其加入到垃圾回收队列,但是进行垃圾回收的线程是一种低优先级的系统级线程,为此系统并不会马上进行对象的消除, 而何时消除并释放内存是无法预知的。 在Java 中一般是在 CPU 空闲或者是空间不足时自动进行垃圾回收,对于程序员来讲, 是无法精准的控制垃圾回收的时机和回收的顺序,哪怕是 Java 虚拟机抛出 OutOfMemoryError 异常, 或者是程序员调用了System.gc()方法请求 JVM 进行垃圾回收。
       C++也是一种面向对象语言,但由于兼容了 C 我们通常认为它是一种半面向对象语言。 在 C++中内存的分配主要有三种方法:1)全局变量和静态变量存储在静态存储区中,生存的周期就是程序运行的周期,即当程序结束,才释放这些存储空间;2)函数内部的局部变量存储在栈上,生存的周期就是该变量所在函数的运行周期,即函数调用结束后,这些存储空间自动释放。3)动态分配存储空间,在 C 语言中通过malloc,free 来完成内存空间的分配与释放, 在 C++中通过 new,delete来完成内存空间的分配与释放, 生存周期是由 new 和 delete 来决定的。
在 C++中程序员运用 new 实现动态分配内存空间,分配后就需要负责这块内存的整个生命周期。 从分配到使用再到最后的释放,这样的过程显的很灵活,但同时也十分繁琐,程序员很容易由于某种原因而忘记释放内存,从而导致内存的泄露。 而 C++不像 Java 那样有 GC自动实现垃圾回收,但为我们提供了智能指针来解决内存问题。 智能指针是一种像指针的 C++对象,它能够在对象不使用的时候自己销毁掉。
       在 C++标准库(std)中提供了一种智能指针 auto_ptr,实际上该智能指针是一种模板类,其工作原理是:通过 new 来分配内存空间构造一个对象,通过自动调用析构函数来完成对这段内存的释放。 具体的实现是:auto_ptr 在构造时获取对某个对象的所有权,在析构时释放该对象,这样可以提高代码的安全性。
例如:
int * p=new int();
auto_ptrap(p);

智能指针 ap 获取了 p 的所有权, 从此我们不必关心应该何时释放 p, 更不用担心发生异常会有内存泄漏。 auto_ptr 智能指针使用简单,方便灵活,除了在定义的时候与普通指针有一点区别以外,其他具体的使用与普通指针是一样的,但是 auto_ptr 智能指针不能将数组作为参数以及不能将 auto_ptr 对象作为标准模板库(STL)容器的元素使得它的使用并不是很广泛。

Boost 库 是 为 C++语言标准库提供扩展的一些 C++程序库的 总称 ,Boost 库为我们定义了多个不同智能指针来 管理不同的场景 ,shared_ptr 是使用最广泛的智能指针。 shared_ptr 智能指针在内部维护一个引用计数器, 当有指针指向这块内存区域时引用计数器加 1,反之减 1, 若没有任何指针指向引用计数器为 0, 则释放内存区域。shared_ptr 指针可以实现共享和转移所有权, 同时它可以被 STL 的容器所使用,这一点与 auto_ptr 指针不同,还有一个更大的特点就是适合管理对象被若干个对象共享的复杂问题。 scoped_ptr 是 Boost 库中最简单的智能指针,当指针离开作用域时释放相关的资源,该指针不能共享指针的所有权也不能转移所有权,即内存地址只能给声明的变量使用而不能给其他使用。 Boost 库还有很多其他智能指针,这里不再一一叙述,总之在 C++中不论使用标准库中的智能指针,还是 Boost 库中的智能指针,在一定的条件下可以实现垃圾回收,同时智能指针使用起来比较简单,能够有效地解决内存泄露问题。
【参考文献】
[1]Java 内存分配与释放[OL]. http://wenku.baidu.com/view/c124098ccc22bcd126f
f0cd4.html.
[2]全面分析 Java 的垃圾回收机制[OL]. http://tech.qq.com/a/20060726/000329.htm.
[3]陈龙得,毕海滨.浅谈在 C++中如何实现垃圾自动回收[J].电脑知识与技术,
2008,7:2007-2008.
[4]C++Boost 库中的智能指针论 [OL]. http://blog.sina.com.cn/s/blog_6eb6c 4590
100n74y.html.
作者简介:王艳娟(1979—),女,济南职业学院教师。

浅析 Java 与 C++ 的垃圾回收机制的更多相关文章

  1. Java高级之虚拟机垃圾回收机制

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 区别于C语言手动回收,Java自动执行垃圾回收,但为了执行高效 ...

  2. java基础(一):谈谈java内存管理与垃圾回收机制

    看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...

  3. java: system.gc()和垃圾回收机制finalize

    System.gc()和垃圾回收机制前的收尾方法:finalize(收尾机制) 程序退出时,为每个对象调用一次finalize方法,垃圾回收前的收尾方法 System.gc() 垃圾回收方法 clas ...

  4. java基础学习之垃圾回收机制

    回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计 ...

  5. Java虚拟机(JVM)与垃圾回收机制(GC)的详解

    一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...

  6. Java 内存分配及垃圾回收机制初探

    一.运行时内存分配 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则 ...

  7. Java内存分配及垃圾回收机制(未完待待续)

    Java内存区域 1.内存区域 jvm运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 方法区 Java堆 大图 2.概念解释 程序计数器   线程私有的一块很小的内存空间,它是当前线程所执行 ...

  8. Java内存分配及垃圾回收机制

    Java内存区域 1.内存区域 jvm运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 方法区 Java堆 大图 2.概念解释 程序计数器   线程私有的一块很小的内存空间,它是当前线程所执行 ...

  9. 【转】Java虚拟机的JVM垃圾回收机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp43       1.JVM内存空间     JVM堆(Heap)= 新生代 ...

随机推荐

  1. Java 添加Word形状或图形

    本文将介绍通过java编程在Word文档中添加形状(图形),包括添加单个图形.组合图形,以及格式化图形样式,如设置形状填充色.大小.位置.边框样式.边框颜色.边框粗细.图形旋转角度.图形文本环绕方式等 ...

  2. 仿微信 即时聊天工具 - SignalR (一)

    话不多说,先上图 背景: 微信聊天,经常会遇见视频发不了,嗯,还有聊天不方便的问题,于是我就自己买了服务器,部署了一套可以直接在微信打开的网页进行聊天,这样只需要发送个url给朋友,就能聊天了! 由于 ...

  3. day20190904一号店网页HTML+CSS

    1.知识要理一理.梳理.当天讲了什么内容?当天我学习到了什么内容?看懂.所有的学习型从模仿开始.1.看懂代码,看懂思路,学思路,多问自己问题,为什么要这么写?下一步为什么要这么写?因 果.2.多练多敲 ...

  4. C# 轮流展示照片

    代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...

  5. 浅谈C#中的序列化与反序列化

    今天我利用这篇文章给大家讲解一下C#中的序列化与反序列化.这两个概念我们再开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,甚至可以说是不知道.因此我希望通过这篇文 ...

  6. mac os 搭建私有DNS 之 dnsmasq

    - MAC OS 创建私有DNS 仓库 - 使用场景 实际工作中有一些私有的域名需要修改host才可以访问 例如:localhost.dev develop-test.dev - 安装方法 brew ...

  7. metronic 表格插件 datatables

    官方网站:https://datatables.net/ css引入:datatables.min.css && datatables.bootstrap.css && ...

  8. go实践之swagger自动生成api文档

    文章目录 go实践之swagger自动生成api文档 1.安装需要用到的包 2.接口代码支持swagger 3. 生成swagger接口 go实践之swagger自动生成api文档 作为一个后端开发, ...

  9. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  10. [TimLinux] django SELinux+httpd+mod_wsgi部署

    1. 实验项目 $ django-admin startproject myweb $ cd myweb/ $ python manage.py startapp poll 1. 配置使用MySQL ...