首先感谢强大的网络资源,本博文是根据网络上的各种资源进行整合,然后加入自己的理解而成,可能会与其它网络资源有重复,望其他作者多多包涵。由于初学java,如有不准确的描述还请读者指正。下面正式切入正题:
众所周知,java和C++都是面向对象的编程语言,但是与C++相比,java上手比较容易,而且使用方便。小弟对c++了解不是很多,但是有一点是C++初学者最为头痛的问题,那就是内存管理,这也正是C++和java之间很大的一个区别。在C++中,内存是依靠程序员自己来管理的,编写程序过程中稍有不慎就会导致致命的错误————崩溃;而java中,内存是依靠java虚拟机来管理的,叫做垃圾回收机制,程序员可以不用去过多关心这方面的东西,因此也剩下了不少的时间和精力。但是对于一个优秀的程序员而言,这种内存自动管理的机制并不是一件好事,就像手工制作的皮鞋远比机器制作的皮鞋要好的多,舒服的多一样。内存自动管理不仅会降低程序的运行效率,同时也降低了程序的可靠性,所以,java获得了方便,易学的优势是在牺牲了效率和程序可靠性的基础之上的。既然java内存管理都是自动化的,那我们为啥还要去了解呢,原因很简单:有助于个人能编写出更加优秀的代码。
下面就让我们了解一下java内存的管理机制:
java内存的管理无非就是两点:内存的分配和内存的回收。
其中内存分配包括堆和栈两部分:堆中存储的都是实体,而栈中存储的是指向实体的引用;
例如:新建一个数组 int[] arr = new int[3];在内存中的分配是这样的:
其中,栈中的数据不是长久存在的。arr位于栈中,其中存放的是数组的地址,一旦出了作用域,arr将被释放掉,而堆中的数据不会被释放,但是也没有索引能够获取数组的数据。因为arr是找到数组数据的唯一一把钥匙,钥匙丢了,那么数据也就无法被利用了,也就成了内存垃圾,在C++中,这部分垃圾是程序员自己去处理的,但是在java中有专门的垃圾回收机制,由虚拟机来完成。
同样,java程序运行中调用函数时,也是先加载到栈中,每一个函数形成一个帧,同样遵循先进后出的原则,执行完后这部分内存就被释放掉,这也是为什么函数中局部变量为什么会只在作用域中有效的原因。
附图:Java虚拟机运行时的数据区
相关详细知识参见:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html