java虚拟机和javaGC_Java虚拟机(三):GC算法和种类

一、介绍

GC(Garbage Collection),垃圾收集

Java中,GC的对象是堆空间和永久区

二、GC算法

1. 引用计数法

老牌垃圾回收算法

通过引用计算来回收垃圾

Java中未使用,使用者有COM、ActionScript3、Python

实现:

1> 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;

2> 当引用失效时,引用计数器就减1;

3> 只要对象A的引用计数器的值为0,则对象A就不可能再被使用。

77a3b1a1c56187081be448aeb2f03bed.png

缺点:

引用和去引用伴随加法和减法,影响性能

很难处理循环引用

6745abda9edb1a00df01e251dfd27603.png

2. 标记-清除算法

标记-清除算法是现代垃圾回收算法的思想基础。

标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。

实现:

在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。

在清除阶段,清除所有未被标记的对象。

具体过程如下图所示:

7f090e2c0ca63106b551b3e7f8e61ee3.png

缺点:

会产生大量不连续的内存碎片。可能会导致在需要分配较大对象时,无法找到足够的连续的内存空间,而不得不提前进行另一次的垃圾收集动作。

3. 标记-压缩算法

标记-压缩算法适合用于存活对象较多的场合,如老年代。

它在标记-清除算法的基础上做了一些优化。

和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。

但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。

最后,清理边界外所有的空间。

具体过程如下图所示:

1ee02db56602b4bdb38b80661a974dcb.png

4. 复制算法

与标记-清除算法相比,复制算法是一种相对高效的回收方法

不适用于存活对象较多的场合 如老年代

将原有的内存空间分为两块,每次只使用其中一块

在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,

之后,清除正在使用的内存块中的所有对象,

最后,交换两个内存的角色,完成垃圾回收

具体过程如下图所示:

d7f124e73ee9eb6bf39c34c79f4223c2.png

缺点:

空间浪费,内存缩小为原来的一半。

5. 分代收集算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法。

依据对象的存活周期进行分类:短命对象归为新生代,长命对象归为老年代。

根据不同代的特点,选取合适的收集算法

少量对象存活(新生代),适合复制算法

大量对象存活(老年代),适合标记清理或者标记压缩

637bc5f94863d01a492e8c7e6bd56335.png

三、Stop-The-World

Java中一种全局暂停的现象

全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互

多半由于GC引起

Dump线程

死锁检查

堆Dump

GC时为什么会有全局停顿?

类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远打扫不干净,只有让大家停止活动了,才能将房间打扫干净。

危害:

长时间服务停止,没有响应

遇到HA系统,可能引起主备切换,严重危害生产环境。

原文:https://www.cnblogs.com/wslook/p/9127601.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看似简单但容易忽视的编程常识

这些年写了很多的代码、也读过很多的人写的代码,这几年,写代码的机会越来越少,但是每次写代码,感觉需要思考的东西越来越多,好的代码确实难能可贵,在国内业界中,好的软件不少,但是好…

NET问答:在 Linq 查询中可以处理异常吗?

咨询区 Jader Dias:先上例子:myEnumerable.Select(a > ThisMethodMayThrowExceptions(a));如何让上面的 Linq查询 即使在抛出异常的情况下也能完整的执行,就像那种带有默认值的 try...catch 一样,当异常抛出时总会执行 catch 后再把它救回…

ASP.NET : Kerberos网络认证过程

今天抽时间初略学习了一下kerberos网络认证过程,作为笔记整理如下,希望与大家分享。 一、Kerberos初步定义: Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者”。Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户…

MIPS投RISC-V是龙芯新征程的开始

日前,外媒报道MIPS Technologies宣布将放弃继续设计MIPS处理器,转向了RISC-V。在MIPS加盟RISC-V阵营后,有人鼓吹龙芯要完,但事实上,这完全是不了解龙芯具体情况的臆测。特别是在龙芯开发自主指令集LoongArch之后&#…

近期GitHub上最热门的开源项目(附链接)

2 月份 GitHub 上最热门的开源项目又出炉了,又有哪些新的项目挤进热门榜单了呢,一起来看看。1、nocodehttps://github.com/kelseyhightower/nocode Star 16256这是 2 月份新出炉的项目,可以说是 2018 年最火的佛系编程了,这个项目…

fb静态区域_fb 静态数据

在STAT中定义静态变量,并在INITIAL VALUE中设定初始值,静态变量的初始值会自动存如对应的背景数据块中回答者: 天晴09 - 初级工程师&nbsp&nbsp第9级2008-09-10 17:01:08你可以在fb中定义的时候直接输入初始值,也可以在ob…

Apache-不重启完成添加或更改域名

这两天开始学习Linux环境下配置Apache服务器,结合现在行业实况,我特地注意学习了虚拟主机的配置方法,我买的书上讲的方法是在httpd.conf文件中添加VirtualHost来实现的,经过实践也成功了,但是这个方法需要在配置后重启…

9年没涨价,上太空……这些树莓派的冷知识你知道多少?

作为最成功的微型计算机,开源的树莓派(Raspberry Pi)在技术圈和学术界一直广受编程爱好者的好评,各路大神基于树莓派制作的新奇设备层出不穷,围绕这款微型计算机已经形成了一种独特的 DIY 文化,相关的开源软…

汇编语言入门教程

学习编程其实就是学高级语言,即那些为人类设计的计算机语言。但是,计算机不理解高级语言,必须通过编译器转成二进制代码,才能运行。学会高级语言,并不等于理解计算机实际的运行步骤。计算机真正能够理解的是低级语言&a…

java将图片铺满panel_如何让添加的背景图片铺满整个JFrame?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼参考这个看看import java.awt.event.*;import javax.swing.*;import java.awt.*;public class BackgroundImage extends JFrame{JScrollPane scrollPane;ImageIcon icon;Image image;public BackgroundImage(){icon newImageIcon(…

SQL如何备份到异机

--SQL如何备份到异机 写成存储过程,建立作业定时备份~~~ --在sql中映射一下就可以了 exec master..xp_cmdshell net use z: \\yizhi\D$ "密码" /user:yizhi\administrator /*--说明: exec master..xp_cmdshell net use z: \\xz\c$ "密码" /user…

轻量易用的微信Sdk发布——Magicodes.Wx.Sdk

概述最简洁最易于使用的微信Sdk,包括公众号Sdk、小程序Sdk、企业微信Sdk等,以及Abp VNext集成。名称NugetMagicodes.Wx.PublicAccount.SdkMagicodes.Wx.PublicAccount.Sdk.AspNetMagicodes.Wx.PublicAccount.Sdk.Abp如何贡献?如何快速封装一个…

数学界的高冷之王,N次拒绝巨额奖金:我穷,但是我不缺钱。。。

在现实生活中,你和谁在一起的确很重要,甚至能改变你的成长轨迹,决定你的人生成败。是否还记得,当你跟学霸做同学的时候,你总会莫名其妙跟他一起撸题目;当宿舍其他兄弟正在打游戏的时候,你也想着…

php-7.1.0,PHP 7.4.0 Alpha 1 v7.4.0 官方最新版

PHP团队近期宣布推出PHP 7.4.0首个版本PHP 7.4.0 Alpha 1,且下一个Alpha 2版本也在计划推出,不过作为早期测试版本,建议不要在生产环境中使用,想体验PHP最新运行逻辑的可以下载体验PHP 7.4.0 Alpha 1源码。基本简介PHP原始为Perso…

OneOfT1,…,Tn清新

OneOf——其中之一,这是一个泛型类,意思就是这里泛型中的任何一个类都可以,还是看代码吧。引入包install-package OneOf实现一个产品查询,有三种情况,查询到返回;查询不到;查询出错。[ApiContro…

VMware Workstation(虚拟机) V6.0.2 Build 59824 汉化版 |

【基本介绍】 VMWare是一个“虚拟PC”软件.它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相 比,VMWare采用了完全不同的概念.多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器.VMWare是真正“同时”运行&…

java导出 elsx 文件,如何获取java导出的excel文件,发送请求导出excle文件

如何获取java导出的excel文件1234567891011121314request.setCharacterEncoding("utf-8");String title request.getParameter("title");//title URLDecoder.decode(title,"utf-8");int maid Integer.parseInt(request.getParameter("ma…

算法分析的正确姿势

一、前言在进一步学习数据结构与算法前,我们应该先掌握算法分析的一般方法。算法分析主要包括对算法的时空复杂度进行分析,但有些时候我们更关心算法的实际运行性能如何,此外,算法可视化是一项帮助我们理解算法实际执行过程的实用…

浏览器缓存机制的研究分享

源宝导读:互联网Web应用大行其道的今天,浏览器已经成为Web应用运行的重要平台。而Web应用对浏览器缓存机制的高效利用,可以大幅提升应用性能和用户体验。本文将对浏览器缓存机制进行系统化的梳理,分享我们的经验。一、背景计算机读…

Windows2008应用之配置客户端自动添加打印机

打印机对我们每一个人来说都是习以为常的东西了,给你一条远程打印机共享路径,你只要轻轻的双击想安装的打印机图标,等上个三五秒打印机就安装好,这台打印机就任你摆布了。但相对我们IT人员来说,全面的自动化将是我们的…