admin 管理员组文章数量: 1087139
2024年4月30日发(作者:vector初始化赋值)
1、Java的内存管理就是对象的分配和释放问题。
在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),
所有的对象都在堆 (Heap)中分配空间。
对象的释放是由GC决定和执行的。
在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两
条线的方法简化了程序员的工作。但也加重了JVM的工作。这也是Java程序运行速度较
慢的原因之一。
GC释放空间方法:
监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当该对象不
再被引用时,释放对象。
2、内存管理结构
Java使用有向图的方式进行内存管理,对于程序的每一个时刻,我们都有一个有向图
表示JVM的内存分配情况。
将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被
引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开
始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达
的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不
可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。
3、使用有向图方式管理内存的优缺点
Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,
相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
这种方式的优点是管理内存的精度很高,但是效率较低。
另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构
件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。
★ Java的内存泄露
Java虽然由GC来回收内存,但也是存在泄露问题的,只是比C++小一点。
1、与C++的比较
c++所有对象的分配和回收都需要由用户来管理。即需要管理点,也需要管理边。若
存在不可达的点,无法在回收分配给那个点的内存,导致内存泄露。存在无用的对象引用,
自然也会导致内存泄露。
Java由GC来管理内存回收,GC将回收不可达的对象占用的内存空间。所以,Java
需要考虑的内存泄露问题主要是那些被引用但无用的对象——即指要管理边就可以。被引
用但无用的对象,程序引用了该对象,但后续不会再使用它。它占用的内存空间就浪费了。
如果存在对象的引用,这个对象就被定义为“活动的”,同时不会被释放。
版权声明:本文标题:java内存分配及释放 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1714440223a680209.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论