当前位置:首页 » 操作系统 » gc算法

gc算法

发布时间: 2022-01-09 14:16:44

java gc中为什么复制算法比标记整理算法快

  1. 标记整理算法:顾名思义会涉及两个过程:标记过程:将被回收的对象进行标记;回收过程:gc找到标记的对象执行垃圾回收,简单的理解为需要遍历到单个对象...

  2. 复制算法:相当于事先把内存划分为两块,执行gc时把存活的对象复制到另一块内存区域,剩下的全部清除,简单的理解为批量处理.

  3. 复制算法:实现简单,运行效率高,但每次只能使用一半内存,因此内存的利用率不高;标记整理算法,涉及两个过程,运行效率慢,且整理之后会产生不连续的内存空间

⑵ gc用的引用可达性分析算法中,哪些对象可作为gc roots对象

›在VisualBasic的程序设计中,面向对象是非常重要的编程概念。设计VisualBasic应用程序的过程,实际上是处理对象的过程。在编程过程中,可以使用由VisualBasic提供的对象,如窗体、控件和数据访问对象,也可以在应用程序中控制其它应用程序对象,甚至可以创建自己的对象,并且为它们定义附加的属性或方法。
›对象是可以作为单元处理的代码和数据的组合。对象可以是应用程序的片段,如控件或窗体,也可以是整个应用程序。›
VisualBasic中的每个对象都是由一个类来定义的。类相当于模子,它决定了每个铸件的特征,例如大小和形状。利用同一个模子,可以铸造出许多铸件。而对象就是铸件。
›虽然在实际编程的过程中,经常忽略类和对象的区别,但还是应该注意以下的两个概念:
工具箱上的控件代表的是类,控件是要等到它们在窗体上绘制出来之后才存在的。在建立一个控件的时候,实际上是建立的控件类的一个实例,这个实例才是在应用程序中要控制的对象。
在设计时,处理的窗体实际上是一个类。在运行时,VisualBasic才产生窗体的对象。
›对象具有自己的属性、方法和事件。属性窗口中列出了当前应用程序中的对象的类和属性。
›对象的属性是对象自己所封装的一些数据,用于定义对象自身的外观和相应的一些性质。对象的方法实际上是对象已经封装好的一段程序,它能够完成一定的功能,例如完成对对象自身的一些修改和调整等。对象的事件实际上也是一种数据类型,它通过接受系统传递一个应用程序的消息,从而根据用户的操作或者应用程序的运行做出相应的反应。›处理对象的过程,就是对对象的属性赋值,使用对象的方法和利用对象的事件,控制对象的外观和行为和对用户的操作做出反应的过程。›
对象提供了用户不必自己去编写的程序代码,例如:用户可以创建自己的对话框,但实际上并不需要这样做,而是利用VisualBasic提供的常用对话框控件。
希望我能帮助你解疑释惑。

⑶ JVM针对年轻代和老年代的GC算法有什么区别

年轻代大多数都是用完就删的,所以年轻代用的是标记复制,把不删的标记出来,然后复制,最后清空。而老年代的是已经经过一次gc存活下来的,大多都是要长时间用的,要删除的少,所以采用的是,标记删除,把要删除的标记出来,统一删除

⑷ GC是什么意思

常用的GC算法: 1)标记非活动对象 --何为非活动对象,通俗的讲,就是无引用的对象。追踪root对象算法: 深度追踪root对象,将heap中所有被引用到的root做标志,所有未被标志的对象视为非活动对象,所占用的空间视为非活动内存。2)清理非活动对象 Copy算法: 方法:将内存分为两个区域(from space和to space)。所有的对象分配内存都分配到from space。在清理非活动对象阶段,把所有标志为活动的对象,到to space,之后清楚from space空间。然后互换from sapce和to space的身份。既原先的from space变成to sapce,原先的to space变成from space。每次清理,重复上述过程。优点:算法不理会非活动对象,数量仅仅取决为活动对象的数量。并且在的同时,整理了heap空间,即,to space的空间使用始终是连续的,内存使用效率得到提高。缺点:划分from space和to space,内存的使用率是1/2。Compaction算法: 方法:在清理非活动对象阶段,删除非活动对象占用内存,并且把活动对象向heap的底部移动,直到所有的活动对象被移到heap的一侧。优点:无须划分from sapce和to space,提高内存的使用率。并且compaction后的内存空间也是连续分配的。缺点:该算法相对比较复杂。sun jdk gc介绍: 在减少gc之前,先来看看来自IBM的一组统计数据: 98%的java对象,在创建之后不久就变成了非活动对象;只有2%的对象,会在长时间一直处于活动状态。如果能对这两种对象区分对象,那么会提交GC的效率。在sun jdk gc中(具体的说,是在jdk1.4之后的版本),提出了不同生命周期的GC策略。young generation: 生命周期很短的对象,归为young generation。由于生命周期很短,这部分对象在gc的时候,很大部分的对象已经成为非活动对象。因此针对young generation的对象,采用算法,只需要将少量的存活下来的对象到to space。存活的对象数量越少,那么算法的效率越高。young generation的gc称为minor gc。经过数次minor gc,依旧存活的对象,将被移出young generation,移到tenured generation(下面将会介绍) young generation分为: eden:每当对象创建的时候,总是被分配在这个区域 survivor1:算法中的from space survivor2:算法中的to sapce (备注:其中survivor1和survivor2的身份在每次minor gc后被互换) minor gc的时候,会把eden survivor1(2)的对象到survivor2(1)去。tenured generation: 生命周期较常的对象,归入到tenured generation。一般是经过多次minor gc,还 依旧存活的对象,将移入到tenured generation。(当然,在minor gc中如果存活的对象的超过survivor的容量,放不下的对象会直接移入到tenured generation) tenured generation的gc称为major gc,就是通常说的full gc。采用compactiion算法。由于tenured generaion区域比较大,而且通常对象生命周期都比较常,compaction需要一定时间。所以这部分的gc时间比较长。minor gc可能引发full gc。当eden+from space的空间大于tenured generation区的剩余空间时,会引发full gc。这是悲观算法,要确保eden+from space的对象如果都存活,必须有足够的tenured generation空间存放这些对象。Permanet Generation: 该区域比较稳定,主要用于存放classloader信息,比如类信息和method信息。对于spring hibernate这些需要动态类型支持的框架,这个区域需要足够的空间。这部分内容相对比较理论,可以结合jstat,jmap等命令(当然也可以使用jconsole,jprofile,gciewer等工具),观察jdk gc的情

⑸ jdk8中,GC用到的的算法有哪些

主要应用Mark-sweepalgorithm(标记消除算法)即从根object(程序直接访问的)开始标记可到达的object算法基于有向图,采用深度优先搜索最后推荐你一本书,《java程序设计语言》([美]KenArnold,JamesGosling,DavidHolmes)上面有对

⑹ 如何设置java gc回收算法

在java和c#语言中,使用的是托管代码,不像c++语言那样由程序员进行内存的手动分配和回收,java语言则由JVM即Java虚拟机 全权负责堆内存的管理,这样子大大减少了程序员的负担,同时一定程度上提高了开发效率和系统稳定性,而常用的GC垃圾回收算法有哪些呢?

Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。

⑺ 谁能简单概括下cms和旧的gc算法的区别

中间调整过几次,先搞了几台机器做了验证,后来逐步推广的。1、调大heap区,由原来的4g,调整到5g,young区的大小不变,还是2g,这时候old区就由2g变为3g了(这样保证old区有足够的空间);2、设置-XX:UseCMSInitiatingOccupancyOnly,其实这个不关这个问题,只是发现半夜CMS进行的有点频繁,就禁止掉了悲观策略;3、设置CMS区回收的比例,从80%调整到75%,让old区尽早的进行,有足够的空间剩余;为什么要有GC(垃圾回收)?JVM通过GC来回收堆和方法区中的内存,GC的基本原理就是找到程序中不再被使用的对象,然后回收掉这些对象占用的内存。主要的收集器有哪些?引用计数器和跟踪计数器两种。引用计数器记录对象是否被引用,当计数器为零时,说明对象已经不再被使用,可以进行回收。java中的对象有复杂的引用关系,不是很适合引用计数器,所以sunjdk中并没有实现这种GC方式。跟踪收集器,全局记录数据的引用状态,基于一定的条件触发。执行的时候,从根集合开始扫描对象的引用关系,主要有复制(ing)、标记-清除(Mark-Sweep)、标记-压缩(Mark-Compact)那种算法。

⑻ GC是如何是如何启动及GC中的算法等

首先,我们先看看GC处理的内存区域在hotSpot(jdk1.8用的这个虚拟机)中是如何划分的.
虚拟机将内存划分为两大区域,新生代与老年代.
而在新生代中
虚拟机又将区域划分为Eden和两块survivor,新创建的对象将会在占有较大区域的Eden和一块survivor,当GC处理垃圾是首先进行标记,会将剩余的存活对象复制之后放在另外survivor中,然后进行清除,清除之会.
那么这里就有一个问题,如果存活对象过多 survivor放不下怎么办?
这里就会使用担保:将溢出的对象放入老年代之中.
如果是老年代那,因为老年代的对象的存活能力很强,且无法有空间为老年代进行担保,所以老年代使用的事 标记-整理
算法进行垃圾回收的,当GC标记清除了可回收的对象,会将剩余对象向一端移动.
那么GC是如何一步步的进行垃圾回收的那?
首先GC要启动可达性算法,那么GC是如何快速的找出所有的GCROOTS节点的那?
1. hotSpot是使用OopMap这样一组数据结构进行记录的,类加载完成之后
会记录对象内什么偏移量是什么类型(书上的话),编译器也会记录栈和寄存机中的位置.,而这个数据会在特点的位置进行记录,这些位置就叫做安全点(safepoint).
还有 GC的启动需要暂时挂起所有的线程,那么GC是在什么时间进行垃圾回收的那?
1.当线程运行到safepoint的时候才会进行GC,那么GC开始之后需要挂起所有线程,这是GC会选择使用主动式的抢断,也就是说GC会设置一个和安全点重合的轮询点,让所有线程都去访问这个轮询点,如果线程访问结果为真,那么就代表线程到了轮询点,便会记性线程中断了.

⑼ gc算法有哪些 gc收集器有哪些

主要应用Mark-sweep algorithm(标记消除算法)
即从根object(程序直接访问的)开始标记可到达的object
算法基于有向图,采用深度优先搜索
最后你一本书, 《java程序设计语言》([美] Ken Arnold, James Gosling, David Holmes) 上面有对于GC的介绍(P305)。

热点内容
编译器前端代码 发布:2024-12-27 15:14:59 浏览:938
消毒计算法 发布:2024-12-27 15:11:38 浏览:632
typescript浏览器编译 发布:2024-12-27 15:10:42 浏览:924
免费监控源码 发布:2024-12-27 15:09:42 浏览:413
我的世界服务器住宅达到了上限怎么办 发布:2024-12-27 15:08:55 浏览:669
明日之后如何用账号和密码 发布:2024-12-27 14:56:41 浏览:493
qtcreator的编译器 发布:2024-12-27 14:51:45 浏览:525
m6手动中配有哪些配置 发布:2024-12-27 14:38:51 浏览:447
在别的电脑怎么知道服务器ip 发布:2024-12-27 14:37:21 浏览:145
为什么是微信支付密码是什么 发布:2024-12-27 14:22:26 浏览:191