⑴ java中的垃圾回收是什么意思
垃圾回收就是gc(gabage collection)。
java比c++的优点就是多了垃圾回收机制,程序员不用去关心垃圾的回收,系统会自动调用去回收内存。
一般我们想回收的时候只需要调用system.gc方法就可以了。系统会自己去调用destroy方法和其他的回收方法释放内存,节省内存空间。
⑵ jvm垃圾回收算法有哪些
1.标记–清除算法
执行步骤:
标记:遍历内存区域,对需要回收的对象打上标记。
清除:再次遍历内存,对已经标记过的内存进行回收。
2.复制算法
将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。
3. 标记–整理算法
因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过去,没啥意义,且浪费时间。所以针对老年代提出了“标记整理”算法。
执行步骤:
标记:对需要回收的进行标记
整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。
4. 分代收集算法
当前大多商用虚拟机都采用这种分代收集算法,这个算法并没有新的内容,只是根据对象的存活的时间的长短,将内存分为了新生代和老年代,这样就可以针对不同的区域,采取对应的算法。如:
新生代,每次都有大量对象死亡,有老年代作为内存担保,采取复制算法。
老年代,对象存活时间长,采用标记整理,或者标记清理算法都可。
⑶ jvm的理解
JVM主要就是为java程序提供一个运行环境,包括类的加载,内存的分配,垃圾的回收,JVM将内存划分为堆,虚拟机栈,线程计数器,本地方法栈,方法区五个内存区域。
为了满足java程序运行时的垃圾回收,jvm提供了一些垃圾回收器用于堆内存的回收,常用的垃圾收集器包括ParNew新生代垃圾收集器,cms老年代垃圾收集器,G1垃圾收集器,这些垃圾收集器根据年龄代对象的特点使用不同的垃圾回收算法,为了解决垃圾收集时GC停顿对于Java程序的影响,使用一些参数的配置尽量减少垃圾回收时的停顿。
比如ParNew新生代垃圾收集器采用复制收集算法,使用多线程收集,提高垃圾回收的效率,CMS采用分段收集,对于比较耗时的阶段允许用户线程并行,但随之而来的也会导致一些缺陷,比如浮动垃圾,cpu资源紧张,内存碎片的问题,对于这些问题,可以通过JVM调优去尽量避免,比如浮动垃圾则可以减小CMS垃圾回收的老年代内存阈值。
G1垃圾收集器则采用可控的GC停顿时间来进行垃圾回收,将内存划分为一个个小的region,逻辑上划分出年轻代和老年代,所以G1垃圾收集器的调优主要就是对于GC停顿时间的调优,太大可能会导致每次GC停顿时间太长,太小可能导致GC发生的太频繁。
对于JVM调优这个话题,我们主要要保证减少YGC的次数,和尽量避免Full GC,因为对老年代的回收由于存活的对象比较多,回收是比较耗时的,那么对于这目标的实现,我们主要围绕一个思想来做,就是尽量保证每次回收后存活的对象可以存放在s区,这些都需要对程序有一个预测和平时的JVM观测
⑷ 什么是Java的垃圾回收机制内部实现原理是什么
Java中的对象没有作用域的概念,只有对象的引用才有作用域。在用new创建出一个对象之后,垃圾回收器就会自动监控该对象,并且会辨别是否需要释放内存,不需要开发者手动释放,所以可以很好的防止内存泄漏。
JVM的垃圾回收器采用的是一种分代(generational )回收策略,共分为三个代:
1.Young(年轻代)
年 轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区 (两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一 个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关 系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。
2.Tenured(年老代)
年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。
3.Perm(持久代)
用 于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显着影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等, 在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。
⑸ java中的垃圾回收机制的作用是什么
java中垃圾回收机制的作用是对程序中无任何引用的对象占据的内存空间进行释放的一种释放内存的方式。
java中垃圾回收机制有几个明显的特点。1.垃圾回收是由虚拟机即JVM执行;2.系统空闲时执行;3.释放的一定是不再被引用的对象;4.回收方法gc()方法,虽然可以主动调用,但是不确定会立即执行。
⑹ jvm的垃圾回收机制详解
1.JVM的gc概述
gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。
在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率。理解了应用程序的工作负荷和jvm支持的垃圾收集算法,便可以进行优化配置垃圾收集器。
垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。
1.1.引用计数
引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。
1.2.对象引用遍历
早期的jvm使用引用计数,现在大多数jvm采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。
为此,gc需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的 gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以增加效率。
2.几种垃圾回收机制
2.1.标记-清除收集器
这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。
2.2.标记-压缩收集器
有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。
2.3.复制收集器
这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
2.4.增量收集器
增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。
2.5.分代收集器
这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。
2.6.并发收集器
并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。
2.7.并行收集器
并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显着的提高java应用程序的可扩展性。
⑺ java中的垃圾回收机制是怎么回事
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。
垃圾收集的意义
在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
垃圾收集能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是Java语言安全性策略的一个重要部份。
垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象, 而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。 (课课家教育java入门到精通)
⑻ java语言中垃圾回收机制的优点,并考虑2种回收机制。求帮忙。
java语言中一个显着的特点就是引入了垃圾回收机制,使C++程序员最头痛的内存管理问题迎刃而解,他使得java程序员在编写承学的哦时候不用再考虑内润管理问题了,由于有了垃圾回收机制,java中的对象不再有“作用域”的概念,只是在对象引用的时候才有“作用域”,垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。
垃圾回收器通常作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚的哦回收,承诺过许愿程序员不能实时的调用来几回收器对某个对象或所有对象进行垃圾回收,回收机制有分带复制来几回收和标记垃圾回收,增量垃圾回收。
希望能帮到你,谢谢!
⑼ Java 垃圾回收机制的作用范围
java中垃圾回收机制的作用是对程序中无任何引用的对象占据的内存空间进行释放的一种释放内存的方式。
java中垃圾回收机制有几个明显的特点。
垃圾回收是由虚拟机即JVM执行;
2.系统空闲时执行;
3.释放的一定是不再被引用的对象;
4.回收方法gc()方法,虽然可以主动调用,但是不确定会立即执行。