基本上,可以把
JVM
内存中的对象引用理解成一种有向图,把引用变量、对象都当成为有向图的顶点,将引用关系当成图的有向边,有向边总是从引用端指向被引用的
Java
对象。因为
Java
所有对象都是由一条一条线程创建出来的,因此可以把线程对象当成有向图的起始顶点。采用有向图来管理内存中的对象具有较高的精度,但缺点是效率较低。
当一个对象在堆内存中运行时,根据它在对应有向图中的状态,可以把它所处的状态分成可达状态、可恢复状态和不可达状态。其中,可恢复状态指对象已经没有任何引用变量引用它,系统的垃圾回收机制准备回收该对象所占的内存。但在回收之前,系统调用该对象的
finalize
方法进行资源清理,如果系统在调用
finalize
方法重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则,该对象进入不可达状态。需要注意的是,一个对象的
finalize
方法只会被调用一次。
一个对象可以被一个方法局部变量所引用,也可以被其他类的类变量引用,或者被其他对象的实例变量所引用。
强引用
由于
JVM
肯定不会回收强引用所引用的
Java
对象,因此强引用是造成
Java
内存泄露的主要原因之一。
软引用
对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。
弱引用
对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
软引用和弱引用都会造成引用的对象为
null
的现象,为此,需要在使用引用对象前判断对象是否为空,如果为空就重建该对象。
虚引用
如果一个对象只有一个虚引用,那它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(
ReferenceQueue
)联合使用。
需要指出的是,要使用这些特殊的引用类,就不能保留对对象的强引用。如果保留了对对象的强引用,就会浪费这些类所提供的任何好处。
堆内存的分代回收
分代回收策略基于以下两点事实:
l
绝大多数对象不会被长时间引用,这些对象在
Young
期间就会被回收;
l
很老的对象和很新的对象之间很少存在相互引用的情况。
Permanent
代主要用于装载
Class
、方法等信息,默认为
64M
,垃圾回收机制通常不会回收
Permanent
代中的对象。对于像
Hibernate
、
Spring
这类喜欢
AOP
动态生成类的框架,往往会生成大量的动态代理类,因此需要更多的
Permanent
代内存。
内存管理的小技巧
l
尽量使用直接量
l
使用
StringBuilder
和
StringBuffer
进行字符串连接(其中StringBuffer是线程安全版本)
l
尽早释放无用对象的引用
l
尽量少用静态变量
l
避免在经常调用的方法、循环中创建
Java
对象
l
缓存经常使用的对象
l
尽量不要使用
finalize
方法
l
考虑使用
SoftReference
分享到:
相关推荐
Java的内存回收, 及时的回收内存资源,更有利于程序的稳定性
Java内存泄露及内存无法回收解决方案,深入讲解相关原理及相关过程。
一、Java对象在内存引用状态 内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用... 强引用是Java编程中广泛使用的引用类型,被强引用所引用的Java对象绝不会被垃圾回收机制回收,即使系统内存紧张;即使
描述java内存回收机制,异常出现原因,解决方案
java 垃圾回收机制 内存泄漏 技术分享 相关技术分享
主要以图文结合的方式为大家详细介绍了java内存回收机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...
JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收
在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由...
java内存管理与垃圾回收
经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...
Java内存与垃圾回收调优,Java内存与垃圾回收的调优是一个重要的主题,特别是在高性能和大规模的应用程序中。以下是一些关键的调优建议和步骤: 理解内存结构: Java堆是主要的内存区域,用于存储对象实例。 堆内存...
JAVA内存溢出问题总结
下面小编就为大家带来一篇深入了解java内存分配和回收策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。
1、JAVA 内存管理总结 2、Java的内存管理实例 3、垃圾回收机制:
通过简单的java程序测试Linux服务器内存使用、回收情况,排查Linux服务器内存使用异常的情况
gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。
Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它
操作系统实验和课设,java实现动态内存分配和回收,实现算法FF,NF,WF,BF,有swing界面