Java编程——jvm优化之 图解垃圾回收
多世纪,目前已经十分成熟了。因此本篇主要从这两个方面来了解:
1. 哪些对象需要被回收?
2. 如何回收?
一、谁要被回收
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同是数据区域,这些区域有各自各自的用途。主要包含以下几个部分组成:
1、程序计数器
程序计数器占用的内存空间我们可以忽略不计,它是每个线程所执行的字节码的行号指示器。
2、虚拟机栈
java的虚拟机栈是线程私有的,生命周期和线程相同。它描述的是方法执行的内存模型。同时用于存储局部变量、操作数栈、动态链接、方法出口等。
3、本地方法栈
本地方法栈,类似虚拟机栈,它调用的是是native方法。
4、堆
堆是jvm中管理内存中最大一块。它是被共享,存放对象实例。也被称为“gc堆”。垃圾回收的主要管理区域
5、方法区
方法区也是共享的内存区域。它主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(jit)编译后的代码数据。
以上就是jvm在运行时期主要的内存组成,我们看到常见的内存使用不但存在于堆中,还会存在于其他区域,虽然堆的管理对程序的管理至关重要,但我们不能只局限于这一个区域,特别是当出现内存泄露的时候,我们除了要排查堆内存的情况,还得考虑虚拟机栈的以及方法区域的情况。
知道了要对谁以及那些区域进行内存管理,我还需要知道什么时候对这些区域进行垃圾回收。
二、如何回收
上述的两点讲解之后,我们大概明白了,哪些对象会被回收,以及回收的依据是什么,但回收的这个工作实现起来并不简单,首先它需要扫描所有的对象,鉴别谁能够被回收,其次在扫描期间需要 ”stop the world“ 对象能被冻结,不然你刚扫描,他的引用信息有变化,你就等于白做了。
分代回收
我们从一个object1来说明其在分代垃圾回收算法中的回收轨迹。
1、object1新建,出生于新生代的Eden区域。
2、minor GC,object1 还存活,移动到Fromsuvivor空间,此时还在新生代。
3、minor GC,object1 仍然存活,此时会通过复制算法,将object1移动到ToSuv区域,此时object1的年龄age+1。
4、minor GC,object1 仍然存活,此时survivor中和object1同龄的对象并没有达到survivor的一半,所以此时通过复制算法,将fromSuv和Tosuv 区域进行互换,存活的对象被移动到了Tosuv。
5、minor GC,object1 仍然存活,此时survivor中和object1同龄的对象已经达到survivor的一半以上(toSuv的区域已经满了),object1被移动到了老年代区域。
6、object1存活一段时间后,发现此时object1不可达GcRoots,而且此时老年代空间比率已经超过了阈值,触发了majorGC(也可以认为是fullGC,但具体需要垃圾收集器来联系),此时object1被回收了。fullGC会触发 stop the world。
在以上的新生代中,我们有提到对象的age,对象存活于survivor状态下,不会立即晋升为老生代对象,以避免给老生代造成过大的影响,它们必须要满足以下条件才可以晋升:
1、minor gc 之后,存活于survivor 区域的对象的age会+1,当超过(默认)15的时候,转移到老年代。
2、动态对象,如果survivor空间中相同年龄所有的对象大小的综合和大于survivor空间的一半,年级大于或等于该年级的对象就可以直接进入老年代。
以上采用分代垃圾收集的思想,对一个对象从存活到死亡所经历的历程。期间,在新生代的时刻,会用到复制算法,在老年代时,有可能会用到标记-清楚算法(mark-sweep)算法或者标记-整理算法,这些都是垃圾回收算法基于不同区域的实现,我们看下这几种回收算法的实现原理。
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:468947140
点击链接加入群聊【Java-BATJ企业级资深架构】:https://jq.qq.com/?_wv=1027&k=5zMN6JB
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
欢迎关注,欢迎留言探讨。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
给妹子讲python-S01E08理清python中的字符编码方法
上一集讲清楚字符编码的基础概念后我相信这一集再来介绍python中的字符编码就会容易的多。 通过上一集我们知道ASCII码包括其最常见的超集Latin-1依赖这样的一个假设即每一个字符与一个字节相匹配由于存在太多的字符因此不可避免的会出现问题Unicode字符集通过使用4个字节来表示1个字符则解决了该问题。 首先来介绍一下Python中的两种字符串 Python中有两种字符串文本字符串和字节字符串。其中文本字符串类型被命名为str内部采用Unicode字符集兼容ASCII码而字节字符串则直接用来表示原始的字节序列用print函数来打印字节字符串时若字节在ascii码范围内则显示为ascii码对应的字符其余的则直接显示为16进制数该类型被命名为bytes。 看一个简单的例子 s = 'apple' b = b'apple' print(b)
- 下一篇
Python复杂网络结构可视化——matplotlib+networkx
什么是networkx? networkx在02年5月产生,是用python语言编写的软件包,便于用户对复杂网络进行创建、操作和学习。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。 ——百度百科 我们可以用networkx做什么? https://networkx.github.io/documentation/stable/auto_examples/index.html 1.画图 2.有向图,无向图,网络图…… 3.总之各种图 看到这你是不是心动了呢?今天的教程就是要教会你画出封面上的三层感知机模型图! Let's get started! 首先导入networkx和matplotlib模块 import networkx as nx im
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器