现在的位置: 首页 > 综合 > 正文

什么是内存泄漏?参加了“第十一届中国国际软件博览会系列论坛-开放软件技术高峰论坛”后

2013年07月03日 ⁄ 综合 ⁄ 共 1791字 ⁄ 字号 评论关闭

       今天去参加了“第十一届中国国际软件博览会系列论坛-开放软件技术高峰论坛”,哦,现在是临晨了,应该是昨天。感觉很不错,sun公司Java软件部门总监,Janet Koening让我不仅了解了Java的很多开发工具,而且真实的让我现场体验了一把标准美语,这比起每天看Friends强多了。Thank you Janet Koening!You was supposed to give us the show about Java technology base on Open JDK  on the schedule,but it was given by the other man in the end,very disappointed!By the way,the lunch was really good,thanks Sun。

     Sun的高级工程师,演讲也不错的,气氛很活泼。可是他说一个多小时,从开始问“Java有内存泄漏吗?”他说“有”起,就一直在讲Java“内存泄漏”的问题。他说:Java“内存泄漏”就是当你不断申请内存对象后,这些对象还可以引用但是实际你已经没有使用了,这时Java虚拟机由于可以通过全局对象找到它们所以不释放,这样内存不断增长直到内存耗尽,这就是Java的内存泄漏。并且还做了一个程序来演示内存泄漏内存耗尽后Java异常处理的提示。这话要是被Java虚拟机编写的人知道了,不吐血才怪!

    那么什么叫内存泄漏?内存泄漏就是在程序堆栈里申请了内存后没有显式释放它,并且使指向这个内存块的所有指针指向其他内存块或退出作用域而导致这个内存块既无法访问又无法释放的情况(自己的定义,可能不是很准确,大概意思是这个了)。这种既不能访问又不能释放的内存不断积累就会造成系统内存浪费,无法使用,甚至耗尽所有系统内存!下面的这段代码就是内存泄漏的例子:
      char *p1 = (char*)malloc(100);
      p1 = NULL;//Now memory leak ,you can use free(p1); to avoid memory leak when p1 is no longer used
      char *p2 = new char[100];
      p2 = NULL;//Now  memory leak again ,you can use delete p2; toavoid memory leak when p2 is no longer used

    Java内存泄漏的例子我实在没有办法举,因为Java虚拟机做的事就是把这些不能访问的内存释放的,所以如果Java虚拟机的编写者编程的时候没有开小差的话,Java是不会有内存泄漏的,如果有也是当有内存不能访问后Java虚拟机还来不及释放暂时的内存泄漏,当虚拟机有CPU时间后就会把它们释放的。演讲者所说的充其量不过是编程不规范而已,如果把它归为内存泄漏Java虚拟机就白干了。
     所以内存泄漏不能随便说的,因为那关系到一个程序员是不是菜鸟的问题。跟内存泄漏一起出现的敏感问题就是内存溢出,它是和内存泄漏是双胞胎,常常令C、C++程序员烦恼不已,内存溢出还可以为黑客攻击带来潜在的威胁。
    内存溢出就是使用的内存超过了申请的内存大小,这种情况轻则覆盖同一个进程的其他变量,造成内存进程不可以意料的后果甚至崩溃,重则超出到其他进程空间或系统空间造成拒绝访问从而程序崩溃,最严重的就是给黑客攻击带来机会。以下代码就是简单的内存溢出(当然现实编程溢出不可能这么简单的出现):

    char *p = malloc(10);//allocate 10 bytes of memory
    char *str = "memory overflow is never happen in my program!";
    memcpy(p,str,strlen(str));//now memory overflow

  不过,这些随着Java虚拟机和.net framework的出现越来越多的Java程序员和.net程序员对内存泄漏和内存溢出都是闻其名而不见其影了,他们不用担心这些问题的发生就像C++程序员不用在意寄存器的利用率一样。对于Java和.net需要内存尽管new就是了!不过还是要注意能使用局部变量就尽量使用局部变量的原则和确定不用的对象要让它赋空值null,从而让虚拟机可以及时释放。不然真的会出现演讲者说的“内存泄漏”的。

抱歉!评论已关闭.