垃圾回收方法:
引用计数器:如果一个变量引用一个对象,就对该对象引用加1,当对象超过生存期或被重置为其他值,减1,到零时垃圾回收,缺陷:循环引用:父类引用子类,子类又引用父类将永远不会被回收。
跟踪收集:
从根结节点开始引用检查,利用标记标识被引用对象,未标记清除。
拷贝收集:
针对内存碎片,根据算法标记被引用对象,并从现在内存区域拷贝到一个大的空白区域,原区域整体回收,该方法利用引用句柄指向堆对象,这样对象的地址改变时更新句柄指向,缺陷:拷贝过程将停止程序运行,性能代价比较大。
按代收集:
按对象的生命周期长短区分对象:年轻代,老年代,年轻代每次都会被回收,如果年轻代对象几次回收后还存在,转入老年代,老年代没有年轻代回收的频率那么多,这样避免了拷贝收集的性能消耗,可以分为多个不同层次的代。
自适应收集:
由jvm决定当前堆状态使用哪种回收机制,根据堆状态切换到某个回收机制。
火车算法
将堆为分不同块,块是排序的,块连接起来组成集合,集合也是排序的,块相当于车厢,集合相当于火车,垃圾回收将先回收最小集合的最小块,这里的最小是指序号,以些类推来回收每个块的垃圾对象,这种算法是基于代的,所以一个块中的对象可能是被老年代引用的,将把该对象移到老年代所有的集合中(火车),如果对象的引用来自于其他集合中非老年代的块中就把对象移到该块中,如果该块以满将在该集合的尾部增加块来保存该对象,当处理完成非老年代引用的对象及老年代引用的对象后,其它的对象就只有集合本身的对块的引用了,将这些对移到集合中最后的块中,最后回收整个块的内存。
引用的分类
强引用
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题,比如一个变量指向一个对象这就是强引用。
软引用
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
Myobj obj=new Myobj();
SoftReference ref=new SoftReference(obj);//创建软引用
如果ref没有被内存回收可以通过如下找到它
Myobj refObj=(Myobj)ref.get(); //否则返回null
软引用可以与ReferenceQueue关联,在回收软引用后软引用对将会被保存在ReferenceQueue中
ReferenceQueue queue=new ReferenceQueue();
SoftReference ref=new SoftReference(refObj,queue);
判断是否被回收
MyReference是我自定义的SoftReference
if(((MyReference)queue.poll())!=null){
//清楚MyReference
}
弱引用
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
WeakHashMap就是一个弱引用实现类
put方法可以插入弱引用,在remove方法或垃圾回收执行前弱引用将一直保存在weakhashmap中。
weakhashmap也有一个queue使用与软引用的相同。
影子引用
保存即将被回收的对象,垃圾回收器将处理将被回收的对象保存在影子引用队列中,所以影子引用必须与一个队列一同使用,可以利用影子引用完成在回收之前想完成的工作。
分享到:
相关推荐
自己学习总结JVM垃圾回收机制的结构图,一起分享!!!
我们通过深入探讨以下几个关键点来理解JVM垃圾回收机制的工作原理: 1. 如何确定某个对象是“垃圾”? JVM垃圾回收机制通过两种主要算法来确定对象是否成为垃圾,即“可达性分析算法”和“引用计数法”。 - 可达性...
深入探索 JVM 垃圾回收:ARM 服务器垃圾回收的挑战和优化 JVM 垃圾回收是 Java 内存管理的重要组成部分,其主要职责是自动释放不再被应用程序使用的内存。在现代计算机系统中,内存是一种宝贵的资源,其有效管理...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...
本文将深入探讨JVM垃圾回收器的工作原理,并通过实例来帮助开发者理解和应用。 1. 垃圾回收概述 - 内存管理:Java中的内存分为堆内存和栈内存,垃圾回收主要针对堆内存。 - 对象生命周期:创建、使用、不再引用...
《JVM垃圾回收艺术——探索Tenured Generation的内涵》 在深入探讨JVM垃圾回收机制的艺术之前,我们先来理解一下“天才”的定义——一种对事业、对工作的极度热爱。JAVA垃圾回收(GC)同样展现出这种对效率和优化的...
### JVM垃圾回收原理详解 #### 一、相关概念与基本回收算法 在深入探讨JVM垃圾回收机制之前,我们先了解几个重要的概念及其工作原理。 ##### 1. 引用计数(Reference Counting) 引用计数是一种较为古老且简单的...
理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...
Java JVM 垃圾回收机制 Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++ 程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。垃圾回收机制的意义是防止...
《垃圾回收系列(3):CLR与JVM垃圾回收器的比较》 本文主要探讨了.NET框架中的CLR(公共语言运行库)与Java平台中的JVM(Java虚拟机)在垃圾回收机制上的异同。垃圾回收是现代编程环境中管理内存的重要机制,它可以...
《JVM垃圾回收与调优详解1》 Java虚拟机(JVM)的内存管理和垃圾回收是其性能优化的关键环节。本文主要探讨JVM内存分配、对象回收的判断标准以及垃圾收集算法。 1. JVM内存分配与回收 在JVM中,内存分为新生代、...
在调整JVM垃圾回收参数时,需考虑到应用的特性,如对象生命周期、内存分配模式等。过多的垃圾回收会导致应用暂停,因此合理配置堆大小和GC策略是提升系统响应速度和稳定性的关键。同时,监控JVM的垃圾回收行为,通过...
"JVM垃圾回收、参数、强软弱虚、常见错误OOM、与微服务结合" JVM垃圾回收是Java虚拟机(JVM)中的一种机制,用于自动回收无效对象所占用的内存资源。垃圾回收机制可以防止内存溢出、提高系统性能和可靠性。 在C/...
【JVM垃圾回收分享】 Java语言的一大亮点是其自动内存管理机制,这使得开发者无需手动管理内存,从而避免了常见的内存泄漏和指针越界问题。这种机制通过垃圾回收(Garbage Collection,简称GC)来实现,确保了程序...
JVM垃圾回收是其核心功能之一,旨在自动管理内存,避免程序出现内存泄漏或过度消耗导致的性能问题。本节将深入探讨JVM垃圾回收机制以及与之相关的工具和概念。 1. **JVM内存模型** JVM内存分为堆内存和栈内存,...
全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现
Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...
jvm 垃圾回收思维导图,总结了现有的垃圾回收器的有点以及使用场景、垃圾回收算法以及回收的判断依据。