`
C_SHaDow
  • 浏览: 49838 次
  • 性别: Icon_minigender_1
  • 来自: 大同
社区版块
存档分类
最新评论

Java内存回收

阅读更多

 

基本上,可以把 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垃圾回收及内存泄漏.pptx

    java 垃圾回收机制 内存泄漏 技术分享 相关技术分享

    图文详解java内存回收机制

    主要以图文结合的方式为大家详细介绍了java内存回收机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java内存管理机制相关资料汇总

    资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...

    JAVA内存模型与垃圾回收

    JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收

    Java的内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由...

    java内存管理与垃圾回收

    java内存管理与垃圾回收

    java 垃圾回收 机制详解

    经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...

    Java内存与垃圾回收调优.docx

    Java内存与垃圾回收调优,Java内存与垃圾回收的调优是一个重要的主题,特别是在高性能和大规模的应用程序中。以下是一些关键的调优建议和步骤: 理解内存结构: Java堆是主要的内存区域,用于存储对象实例。 堆内存...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结

    深入了解java内存分配和回收策略

    下面小编就为大家带来一篇深入了解java内存分配和回收策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java垃圾回收机制和内存分配

    你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。

    Java内存管理机制

    1、JAVA 内存管理总结 2、Java的内存管理实例 3、垃圾回收机制:

    java测试Linux服务器内存使用、回收情况

    通过简单的java程序测试Linux服务器内存使用、回收情况,排查Linux服务器内存使用异常的情况

    java JVM 内存回收

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。

    Java的内存管理机制分析

    Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它

    操作系统实验和课设,java实现动态内存分配和回收,FF,NF,WF,BF

    操作系统实验和课设,java实现动态内存分配和回收,实现算法FF,NF,WF,BF,有swing界面

Global site tag (gtag.js) - Google Analytics