- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java 垃圾回收机制以及经典垃圾回收器详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一.
会有对象循环引用问题:
obja 有objb 的引用 objb 有 obja 的引用,他们相互引用着对方。导致他们无法回收.
可达性分析:
从gc roots 根对象作为起点,根据引用关系向下搜索,如果对象可达,就说明对象存活,如果对象不可达,就说明对象可以被回收.
gc roots的根对象为:
1)在虚拟机栈 栈帧中的 本地变量表 中引用的对象 。
2)方法区静态属性引用的对象 。
3)方法区常量引用 的对象,如字符串常量池中的引用 。
4)本地方法栈中jni引用的对象 。
5)虚拟机内部引用的对象,如基本数据类型对应的class对象,一些常驻的异常对象等,还有系统类加载器 。
6)被同步锁持有的对象 。
等 。
并发 的可达性分析,由于用户线程会即时修改对象的引用关系, 可能会造成两种异常:
1)原本消亡的对象错误标记为存活,这个可以接受,就造成浮动垃圾,下一次收集即可.
2)原本存活的对象 标记为 消失.
三色法分析图:
黑色:已经扫描过的对象 。
灰色:已经访问过,但还有一个引用没有被扫描 。
白色:为被访问过,若到最后还是白色,说明此对象是需要回收的.
黑色误标记为白色有两个条件 。
1)复制器插入一条或多条从黑色对象到白色对象的新引用 。
2)复制器删除了全部从灰色对象到该白色对象的直接或间接的引用 。
解决方法:
1)增量更新,破坏条件1,把黑色对象对白色对象的新增引用记录下来,等并发扫描结束后,再以这些对象出发重新扫描.
2)原始快照(satb),破解条件2,当灰色对象要删除对白色对象的引用关系时,记录下来。并发结束后再以记录节点开始重新扫描.
堆:
新生代(1/3) 老年代(2/3) 。
新生代 分为 eden/from/to 。
新生代存放:比较小,时长比较小 。
老年代:比较大 存放时长比较大 。
轻gc 。
重gc(full gc) -> stw(停止事件),fallgc特别费资源 。
eden -> from <-> to -> old 。
对象在from和to循环15(默认)次之后,会放到老年代 。
算法分为标记 和 清除两个阶段,首先标记出所需要回收的对象,标记完成之后,统一回收所标记的对象.
优点:最基础的算法,实现简单 。
缺点:1)执行效率不稳定,对象越多,效率越低 。
2)内存碎片化,需要分配大对象时可能无足够连续的空间.
代表垃圾收集器:
把内存分为大小相等的两块,每次只使用其中一款,当一块快用完时,它将存活的对象复制到另一块上.
优点:能产生连续的空间 。
缺点:耗内存,对象存活率较高时,效率会降低(不适合老年代).
代表垃圾收集器: 很多新生代的回收,都用这种算法.
首先标记出所需要的对象,标记完成后,对存活对象移动到内存的一段,然后清除边界外的对象.
优点:有连续的内存空间;系统吞吐量(用户线程和收集器的效率总和)会提高.
缺点:整理内存耗时会比较大,会造成 “stop the world”,
代表垃圾收集器:parallel scavenge收集器 。
cms中主要用标记清除算法,但是当内存碎片化到影响对象分配时,就会使用一次标记整理算法 去整理内存碎片.
最基础最悠久的垃圾收集器,叫做 串行收集器,它进行垃圾收集的时候,会停止用户线程(stop the world).
新生代垃圾收集器用 serial,基于复制算法 。
老年代垃圾收集器用 serial old,基于标记整理算法.
优点:所有垃圾收集器中内存消耗最小的,对单核或单线程处理器来说,效率很高。运行在客户端 。
缺点:stop the world 。
parnew收集器就是serial收集器的多线程并行版,除了支持多线并行收集之外,没有太多创新之处.
cms垃圾收集器作为老年代垃圾收集器,不能与parallel scavenge配合工作,只能选择 parnew或者serial收集器.
新生代垃圾收集器,基于 标记复制算法,也是可以通过并行收集的多线程收集器。他关注 吞吐量(用户线程时间/总时间).
cms 收集器是一种以获取最短停顿时间作为目标的垃圾收集器。基于标记清除算法.
步骤:
初始标记->并发标记->重新标记->并发清除 。
1)初始标记:stop the world,标记gc root 能直接关联的对象,速度很快 。
2)并发标记:从gc root直接关联的对象开始遍历整个对象图,时间较长,但与用户线程并行 。
3)重新标记:stop the world,修正并发标记期间对象的状态的改变(增量更新算法,标记新的黑色指向白色的引用),时间也比较短.
4)并发清除:与用户线程同步.
优点:并发收集、低停顿.
缺点:
1)对处理器资源敏感,当处理器核心数量在四个以下时,cms对用户程序影响很大.
2)有浮动垃圾,并发标记时会产生新的垃圾,但是cms本次不会清理它,要等到下一次才会清理。从而可能造成内存不够而产生stop the world 的full gc 。
3)基于标记清除算法,会产生大量的空间碎片,而触发full gc 。
关注吞吐量和延迟时间的最佳平衡.
从整体看,主要采用标记整理算法,从局部看,是标记-复制算法(两个region 之间的复制).
g1把 java对 划分为多个大小相等独立区域 region,每一个region 都可以根据需要,扮演 eden空间、survivor空间或者老年代空间.
g1对年代的划分存在概念上,它可以不是连续的区间。.
region 还有一类特殊的humongous区域,专门存储大对象(1m-32m,可配),把超过region大小的对象分配在连续的 humongous region之中.
每次收集时以region作为最小单元,g1收集器去根据region里面垃圾队的价值大小,在后台维护一个优先级列表,优先处理回收价值收益最大的那些region(每次收集到的内存大小及回收时间的经验值).
g1至少耗费打印java堆容量的10%到20%来维持收集工作.
tams指针:在并发过程中保存新建的对象.
stab:灰色引用对白色引用的删除 记录下来.
g1的步骤:
1)初始标记:stop the world,仅仅标记gc roots 能直接关联的对象,并且修改tams指针 。
2)并发标记:从gc roots 直接关联的对象出发,扫描对象图(并还要处理satb记录下并时有变动的对象),时间长,但是与用户线程并行, 。
3)最终标记:stop the world,短暂,处理遗留下来的少量satb记录 。
4)帅选回收:stop the world,负责更新region的统计数据,对region的回收价值和成本进行排序。根据用户所期望的停顿时间(jvm参数可配)来制定回收计划。可以自由选择多个region作为回收集,然后把存活的对象复制到空的region中,然后清空回收集的region.
除了并发标记外,其它都用停止用户线程,目标不是单纯的追求低延迟,而是延迟可控的情况下获取最大的吞吐量(用户线程时间/总时间,总时间为用户线程时间+垃圾收集时间).
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/xiaoluo5238/article/details/115329940 。
最后此篇关于java 垃圾回收机制以及经典垃圾回收器详解的文章就讲到这里了,如果你想了解更多关于java 垃圾回收机制以及经典垃圾回收器详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在构建一个我想要的 FragmentPagerAdapter(带有小图标的那个); 到屏幕中间(水平)的第一个项目 滑动它并使它们向左/向右移动屏幕的五分之一 实现此目标的最佳方法是什么? 这是一
我正在使用 GalleryView 和大约 40 张图片,而且速度很慢,因为没有回收... 任何人都可以向我展示在 getView 方法上对 GalleryView 的基本回收。 public cla
我收到警告 This FragmentManager should be recycled after use with #recycle() 我正在尝试修复它。有什么建议吗? date.setOnC
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 a specific programming problem, a software a
是否可以在 global.asax 中捕获回收事件? 我知道 Application_End 会被触发,但有没有办法知道它是由应用程序池的回收触发的? 谢谢,Lieven Cardoen 又名 Joh
当我第一次启动应用程序时,我以正确的方式获得了抽屉导航。当我向下滚动抽屉时,问题就出现了。元素开始消失,其中一些甚至交换了位置。我试图找出问题所在,但找不到。希望你能帮助我。 我已经使用 getIte
我正在尝试构建一个 Android 应用程序,在其中使用 RecyclerView。 在 RecyclerView 的项目中,我使用一个 TextView 和四个 CheckBox 来选择任何人。 现
回收 IIS7 应用程序池是否会终止任何当前正在执行的请求?还是等待所有请求完成(如排水管停止)? 我不希望回收规则导致我的 WCF 站点出现间歇性错误。 谢谢 最佳答案 不。 By default,
我动态创建 div,并希望通过检查 div 的 ID 以正确的顺序放置新的 div。 创建新数据时,我对数组进行排序并创建一个新的 div 容器。第一次构建 DOM 时,它工作正常,因为我先创建数据,
IIS 中 Web 应用程序的 .net Recycle 的 Java 等价物是什么。 这是在 IIS 之外的 Linux 机器上使用 Java 时的情况。 只是停止和启动应用程序吗? 最佳答案 并非
问题: 假设您的传输速度高达 10 MB/s,那么回收 DatagramPacket 对象(而不是每次发送数据包时创建一个新对象)是否是一个好主意? 故事: 我正在创建一个 LAN 文件同步应用程序,
我已经使用适配器创建了一个 ListView,但唯一的问题是我们使用了不同的布局,因为它是一个消息传递应用程序。我想通过使用 View 回收来提高性能,但不知道如何回收 View 。 是否可以更改 V
我是 Android 初学者,我不明白为什么会这样。 Activity 截图: 一切正常,除非我向下滚动(因此我认为它与回收有关)...所以当我向上滚动并尝试撤消第一篇文章中的投票(红色箭头)时,它认
我在 RecyclerView 中使用 FlexboxLayoutManager,我需要阻止 RV 回收。我尝试将 itemViewCacheSize() 设置为项目总数,但没有帮助。我也尝试将 ma
在我使用 SearchView 搜索项目后尝试从 RecyclerView 中删除项目时遇到问题,而如果我不使用 SearchView 并正常删除该项目,它工作正常。 这是一个示例,我正在删除该项目,
我正在尝试动态更改 RecycleView 中的图像。它将成功更改但是当我滚动 RecycleView ImageView 时将更改 这是我的适配器类代码: public class Recycler
我有一个表格如下 |GroupID | UserID | -------------------- |1 | 1 | |1 | 2 | |1 |
大家好,在我的 Activity 布局中,我使用这个 XML 来获取按钮数组
我有一个动画时钟,目前有内存泄漏。我目前似乎能够将东西放在图像之上,但不能将其取走或必须清除它(除了重新绘制整个时钟以使秒针不在两个不同的位置之外)。 用于清除时钟组件的代码是: for(UIView
我正在尝试创建一个简单的动画,在 JavaFX 2.x 中将圆向左移动一个像素,该动画有效,但每当我尝试第二次启动时,它就不再起作用了。我尝试了几种方法,代码如下: public void handl
我是一名优秀的程序员,十分优秀!