您的位置:首页 > 编程语言 > Java开发

Java内存模式与内存泄露

2013-06-25 19:06 176 查看
  Java保持了C++大部分的内存分配模式,栈区,堆区,常量区,代码区等。栈堆空间分划更为明确,所有自定义类的对象均在堆中创建,无法在栈中创建对象。仍然使用new关键词创建新实例,但剔除delete关键词,对象内存回收由内置回收机制自动完成,无须程序员干涉。

  Java中去除了指针的概念,所有对象的地址在实例初始化时,可以被内部封装进一个引用变量中,后续使用该引用操作对象。Java中的引用非C++引用,引用被初始化后仍然可以更改其指向的对象。

回收机制的原理:

  内置有一个回收线程,当一个对象的地址未被任何变量引用时垃圾回收机制自动回收内存。

  (猜想,未经验证)当一个对象建立时,对象的地址会被加入一个地址表中,回收线程每隔一段时间检测一次程序中是否有引用变量记录这个地址,如果没有那么将该地址指向的堆中内存空间释放。

关于内存泄露:

  由以上理论可以得出,Java中不存在C++中的内存泄露问题,因为所有对象的引用超出作用域后对象占用内存自动将被回收。但是若一个对象在之后没有被再次使用,而指向他的引用仍然一直存在的话,那么也会形成内存泄露问题。但从语言表达上来讲,内存泄露是指即使想要释放内存,但却找不到释放内存的办法,所以以上这种现象更精准的来说,应该叫内存游离。

  当一个对象不再使用时,其指向的引用后续可能还须要用来记录同类的其它对象,那么可以将该引用设置为null,以便回收机制更快的回收内存。

  java对内存优化处理等被严格封装在jvm内,如内联函数,内存对齐等。程序员可以对内存的操作局限性很大。java中任何元素皆可被看做是一个类,而类皆派生自object 如果程序员自定义一个类,没有派生自任何类,那么默认继承自object类。所以任何类都会多出一些方法和数据,如数组也是一个类,会多出length等成员数据,虽然方便了使用和代码编程,但在内存占用上却无形多出了很多。

  一个java程序应该在内存占用上会高出同类C++不少(jvm从class文件到2进制代码的转换过程中是否会对java程序做进一步优化,如去掉一堆Object类成员里根本在程序中没用到的成员等,这个疑问一直困扰着我)。但开发效率上应该会快很多。在目前计算机运算量与存储量不断增大的趋势下,几千个字节的内存占用j换取更高较的开发效率,更广泛的应用平台,显然是值得的。java语言无疑是一种趋势。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: