程序猿的日常——JVM内存模型与垃圾回收

Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM。在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情况。在Java中JVM内置了垃圾回收的机制,帮助开发者承担对象的创建和释放的工作,极大的减轻了开发的负担。那是不是我们就不需要了解JVM了,显然在做一些优化或者深入研究应用性能的时候,JVM还是起了很关键的作用的。因此本篇就总结性的描述下JVM的内存模型与垃圾回收相关的知识。

本文的主要内容如下:

  • 内存模型
  • 垃圾回收
  • 参考文章

内存模型

Center

各部分的功能

这几个存储区最主要的就是栈区和堆区,那么什么是栈什么是堆呢?说的简单点,栈里面存放的是基本的数据类型和引用,而堆里面则是存放各种对象实例的。
wKioL1mlFPzT7_hLAAA-qYFsUa8977.png-wh_651x-s_286560225.png

堆与栈分开设计是为什么呢?

  • 栈存储了处理逻辑、堆存储了具体的数据,这样隔离设计更为清晰
  • 堆与栈分离,使得堆可以被多个栈共享。
  • 栈保存了上下文的信息,因此只能向上增长;而堆是动态分配

栈的大小可以通过-XSs设置,如果不足的话,会引起java.lang.StackOverflowError的异常

栈区

线程私有,生命周期与线程相同。每个方法执行的时候都会创建一个栈帧(stack frame)用于存放 局部变量表、操作栈、动态链接、方法出口。

存放对象实例,所有的对象的内存都在这里分配。垃圾回收主要就是作用于这里的。

  • 堆得内存由-Xms指定,默认是物理内存的1/64;最大的内存由-Xmx指定,默认是物理内存的1/4。
  • 默认空余的堆内存小于40%时,就会增大,直到-Xmx设置的内存。具体的比例可以由-XX:MinHeapFreeRatio指定
  • 空余的内存大于70%时,就会减少内存,直到-Xms设置的大小。具体由-XX:MaxHeapFreeRatio指定。

因此一般都建议把这两个参数设置成一样大,可以避免JVM在不断调整大小。

程序计数器

这里记录了线程执行的字节码的行号,在分支、循环、跳转、异常、线程恢复等都依赖这个计数器。

方法区

类型信息、字段信息、方法信息、其他信息

总结

名称特征作用配置异常
栈区线程私有,使用一段连续的内存空间存放局部变量表、操作栈、动态链接、方法出口-XSsStackOverflowError OutOfMemoryError
线程共享,生命周期与虚拟机相同保存对象实例-Xms -Xmx -XmnOutOfMemoryError
程序计数器线程私有、占用内存小字节码行号
方法区线程共享存储类加载信息、常量、静态变量等-XX:PermSize -XX:MaxPermSizeOutOfMemoryError

垃圾回收

如何定义垃圾

有两种方式,一种是引用计数(但是无法解决循环引用的问题);另一种就是可达性分析。

判断对象可以回收的情况:

  • 显示的把某个引用置位NULL或者指向别的对象
  • 局部引用指向的对象
  • 弱引用关联的对象

垃圾回收的方法

Mark-Sweep标记-清除算法

341412-20170310115901922-1449104767.png

这种方法优点就是减少停顿时间,但是缺点是会造成内存碎片。

Copying复制算法

341412-20170310120953625-1648207853.png

这种方法不涉及到对象的删除,只是把可用的对象从一个地方拷贝到另一个地方,因此适合大量对象回收的场景,比如新生代的回收。

Mark-Compact标记-整理算法

341412-20170310120436734-894591806.png

这种方法可以解决内存碎片问题,但是会增加停顿时间。

Generational Collection 分代收集

最后的这种方法是前面几种的合体,即目前JVM主要采取的一种方法,思想就是把JVM分成不同的区域。每种区域使用不同的垃圾回收方法。

341412-20170310111906594-1376910719.png

上面可以看到堆分成两个个区域:

  • 新生代(Young Generation):用于存放新创建的对象,采用复制回收方法,如果在s0和s1之间复制一定次数后,转移到年老代中。这里的垃圾回收叫做minor GC;
  • 年老代(Old Generation):这些对象垃圾回收的频率较低,采用的标记整理方法,这里的垃圾回收叫做 major GC。

这里可以详细的说一下新生代复制回收的算法流程:

在新生代中,分为三个区:Eden, from survivor, to survior。

  • 当触发minor GC时,会先把Eden中存活的对象复制到to Survivor中;
  • 然后再看from survivor,如果次数达到年老代的标准,就复制到年老代中;如果没有达到则复制到to survivor中,如果to survivor满了,则复制到年老代中。
  • 然后调换from survivor 和 to survivor的名字,保证每次to survivor都是空的等待对象复制到那里的。

垃圾回收器

467583-20170628093656618-2097152177.png

串行收集器 Serial

这种收集器就是以单线程的方式收集,垃圾回收的时候其他线程也不能工作。
467583-20170628093636461-1904264753.png

并行收集器 Parallel

以多线程的方式进行收集
467583-20170628093724414-184415121.png

并发标记清除收集器 Concurrent Mark Sweep Collector, CMS

大致的流程为:初始标记--并发标记--重新标记--并发清除

467583-20170628093846008-2001476745.png

G1收集器 Garbage First Collector

大致的流程为:初始标记--并发标记--最终标记--筛选回收

467583-20170628093914149-1103645311.png

参考

  • JVM内存模型:http://developer.51cto.com/art/200911/165015.htm
  • 垃圾回收:http://www.importnew.com/19085.html
  • JVM垃圾回收器:http://www.cnblogs.com/chengxuyuanzhilu/p/7088316.html
  • 内存模型: http://blog.csdn.net/u012152619/article/details/46968883

转载于:https://www.cnblogs.com/xing901022/p/7725961.html

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

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

相关文章

智慧城市丨智能时代的城市设计新策略

来源:万物智能视界智慧城市作为解决城市病、提高城市发展质量以及改善城市群建设结构的新型城市形态,已成为世界各地城市发展的必然趋势。借助新兴的信息技术能够随时随地感知、捕获、传递和处理信息,能够实现对城市的精细化、智能化管理&…

从看见到听见,机器人传感能否解决智能制造检测的最后一公里难题?

来源:机器人大讲堂导读手机、无人机、机器人眼睛里的隐藏王者,华为、小米的视觉供应商,这家隐形冠军现在也开始在机器人行业发力,将延伸人类感官?华为、VIVO、小米、魅族,这些市场上你能找到的手机品牌,其…

linux alsa声卡命令,Linux ALSA声卡驱动之一:ALSA架构简介

一. 概述ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。在内核设备驱动层&#xff0…

寒武纪上市:AI芯片和普通芯片有何不同?全球AI芯片公司大全都在这里了

来源:Zach小生作者:腾讯新闻知识官、美国宾州州立大学硕士、芯片工程师Zach小生7月20日,寒武纪正式在A股科创板上市,成为AI芯片第一股,引起了业内的热议和关注。根据相关的资料显示,目前中国IC设计企业已超…

linux java输出到文件,linux java输出到文件内容

linux java输出到文件内容[2021-01-30 07:48:37] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#x…

关于TCP/IP协议及网络通信相关问题

一、网络模型: OSI标准模型七层架构以及其传输数据的模型如下: 传输信息的过程由上之下逐渐封装,接收过程则是由下至上逐渐拆包,每一层只解析自己独立的部分。 二、网络的机要素 1、IP 1 public class NetTest { 2 public sta…

世界人工智能发展究竟到了什么水平

来源:第一财经关于人工智能在当今科技界的发展水平,学术界、产业界和媒体界可能会有不同的看法。我经常听到的一个说法是:现在基于大数据与深度学习的人工智能是一种完全新颖的技术形态,它的出现能够全面地改变未来人类的社会形态…

Quanta杂志长文翻译:通过信息论判定个体的边界

本文是“Quanta magazine”文章“What Is an Individual? Biology Seeks Clues in Information Theory” 的全文翻译。译者Peter,原文地址 https://www.quantamagazine.org/what-is-an-individual-biology-seeks-clues-in-information-theory-20200716/导读&#x…

linux语言 翻译工具,Linux文本转语音工具eSpeak介绍

Text to speech tool in LinuxeSpeak是一款 Linux 命令行工具,能把文本转换成语音。它是一款简洁的语音合成器,用C语言编写而成,它支持英语和其它多种语言。eSpeak 从标准输入或者输入文件中读取文本。虽然语音输出与真人声音相去甚远。但是&…

因果学习的三个层次

来源:混沌巡洋舰昨天龚鹤扬博士在集智的讲座因果学习综述,我借此机会结合我的理解给大家总结客串下这个讲座,和因果学习的核心内容,及巡洋舰一段时间关于因果的文章汇总。这个讲座分为三部分,第一是什么因果及其哲学基…

人与机器——解析人工智能的三大类别以及哲学家的相关思想实验

来源:北京物联网智能技术应用协会你是否曾经产生过怀疑,你身边的某个人可能是个机器人呢?毕竟现在由于技术的发展,机器人的外观、行为都有可能被设置得和人类十分相像。这似乎有些荒谬和匪夷所思,但是你如何能百分之百…

MIT最新报告:完全无人驾驶仍需10年,马斯克:特斯拉已经实现

来源:机器学习研究组订阅号两年前,麻省理工学院成立了「未来工作特别小组」,这个小组目前有20多人,旨在研究「大众创新年代」的工作演变。近期,他们发表了一个最新的报告,重点关注了自动驾驶领域的进展。而…

win7 linux双系统win7启动不了怎么办,双系统windows打不开怎么办|苹果双系统win7打不开怎么解决|mac双系统打不开解决方法-系统城...

2016-03-30 19:28:38  浏览量:22401很多用户都会在电脑上安装Windows双系统甚至多系统,在开机的时候就会出现一个启动菜单让用户选择,如果没有选择将会自动启动默认的系统,那么双系统要怎么修改默认的启动项呢?今天系…

是时候抛弃旧的摩尔定律了

来源:IEEE转自:悦智网在技术领域最著名的准则之一就是摩尔定律。在过去55年的时间里,“摩尔定律”已经描述并预测了晶体管的缩小,如一组称为技术节点的数字在过去以大约每两年一次的频率更新。像一些基于物理学的世界末日时钟一样…

网络对抗技术—-网络对抗实验四

学 号:201421430008 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 吴宙杨 年级 2014 区队 3 指导教师 高见老师 信息技术与网络安全学院 2016年11月7日 实验任务总纲 2016—20…

北大副校长詹启敏回应“25篇论文造假”,​PubPpeer到底靠不靠谱?

来源:科研大匠今日,北京大学常务副校长、北大医学部主任、中国工程院院士詹启敏在个人公众号“潇敏 ScienceArt”上发布《詹启敏关于相关情况的说明》文章,回应了昨日 DeepTech 对北京大学常务副校长詹启敏 25 篇相关论文受到学术不端质疑。事…

c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序

C语言课程设计报告模拟时钟转动程序 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处制 程序设计综合课程设计I目 录第一章 课程设计的目的和要求 1.1 C 语言…

用人工智能监督人工 遭遇非技术困局

来源:科技日报远程办公常态化催生云监工软件市场。近日一款名为Enaible的AI监工软件销售火爆,这种AI软件不仅可以盯着员工干活,还可以对员工的工作效率进行打分……一场新冠肺炎疫情,让远程办公逐渐成为常态。钉钉、飞书、企业微信…

Windows10 【系统周期表】【系统下载表】【大型软件表】

系统周期表 商用名称商用英文名代号版本系统版本上市日期服务周期备注Windows 10无Threshold 1150710.0.10240.174432015.07.292015.07.29 - 2015.11.12默认值Windows 10十一月更新Windows 10 November UpdateThreshold 2151110.0.10586.9622015.11.122015.11.12 - 2016.08.02W…

2020年中国城市人工智能发展指数报告

来源 | 36氪研究院(转载请注明来源)编辑 | 张775大维度、20个三级指标,全面剖析中国36个城市人工智能发展情况2020年是全面建成小康社会与“十三五”规划收官之年,为了实现全面建设小康社会的发展目标、增强经济发展韧性&#xff…