gc原理以及gc日志

一.概述

学习Java的我们都知道垃圾收集(gc),大部分人把这项技术当作是java语言的伴生产物。事实上,gc的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。那我们今天就研究下垃圾收集原理。

二.对象已死吗?

Java的垃圾回收主要是对推内存的回收,里面存放着Java几乎所有的对象实例,垃圾回收之前是要确定哪些还“存活”哪些已经“死去”。

1.引用计数器法

给对象添加一个引用计数器,每当有地方对他进行引用时计数器值➕1;当引用失效时,计数器值就➖1,任何时候计数器值为0的时候表示对象不可能在使用的。

2.可达性分析算法

通过一系列称为“GC Roots”的对象作为起点,从这些节点往下搜索,搜索所走过的路径称为“引用链”,当一个对象到“GC Roots”没有任何引用链相连时,则证明对象不可用的

代码示例:

gc日志如下:

我们很明显的看到gc日志中6092K->456K,意味着虚拟机并没有因为这两个对象互相引用而不回收他们,所以java虚拟机使用的是可达性分析算法标记的。

其实即使被可达性分析算法标记的不可达对象也不是一定会被回收的,虚拟机会对这些对象进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者finalize()已经被虚拟机调用过,虚拟机将这两种情况视为“没有必要执行”。如果对象被判定有必要执行finalize()方法是并在finalize()中与“GC Roots”建立关联则次对象不会被回收了。

三.垃圾回收算法

我们知道了虚拟机怎么标记一个对象是否可用,那他怎么进行回收的呢?其实堆内存可以分为新生代和老年代,新生代又被划分为一个Eden和两个Survivor区域他们的比例为8:1:1,不同的垃圾收集器厂商给对这两个区域给出了不同的算法。

1.新生代——复制算法

新生代对象的特点就是,大部门对象在一次GC中会被回收掉,所以使用的是复制算法:新生代每次创建对象的时候只会使用一个Eden和其中的一块Survivor,在垃圾回收时将存活的对象复制到另外一块Survivor区域,最后清理掉Eden和刚才的Survivor区域。

1.老年代——标记-整理算法

老年代一般保存的是一些大对象,或者不被经常回收的对象,根据特点使用的标记-整理算法:如同名字一样,算法分为"标记"和“整理”两个阶段:首先先标记出所有需要回收的对象,在标记完成后统一回收所以被标记的对象进行整理,将被标记的对象都向一端移动,然后直接清理掉边界以外的内存。

四.HotSpot算法实现

上面说了我们怎么标记对象“死亡”和怎么进行垃圾回收的,但在HotSpot虚拟机在实现这些算法上是必须对算法的执行效率进行考量的。

1.安全点

在可达性分析中对执行的时间的敏感体现在GC停顿上,其意思是在整个分析的过程中看起来就像被冻结在某一个时间点上的,不可以出现分析的过程中引用关系在不断变化,如果这点得不到保证则分析的结果的准确性就得不到保障。这点是导致在GC进行时需要停顿所有的java执行线程。当执行系统停顿下来后,虚拟机并不需要全部上小文和全局所有的位置,虚拟机通过一个OopMap的数据结构在类加载的时候将对象的偏移量数据信息记录下来,所以GC扫描是就直接得到这些信息的。其实这些通过指令被加入进行记载对象信息的OopMap位置也叫做安全点,程序执行时并非所有点都可以停下来开始GC的,只有在到达安全点才能停顿。安全点机制程序执行中,在不太长的时间内会遇到可进入GC的安全点。在实际中会遇到在GC时有线程不再执行,例如线程被挂起了。这是我们需要安全区域去解决。

2.安全区域

安全区域是指在一段代码片段中,引用关心不会发生变化。在这个区域中的任意地方开始GC都是安全的。在代码执行到安全区域是,首先表示这直接进去安全区域,这样虚拟机在这段时间GC时就不用管那些标记为安全区域的线程了。当离开安全区域时首先得判断是GC分析是否完成,没完成则需要等待。

五.理解GC日志

这是上图打印的gc日志

[GC (System.gc()) [PSYoungGen: 6092K->448K(38400K)] 6092K->456K(125952K), 0.0051702 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

PSYoungGen表示的是新生代gc不同垃圾收集器新生代名称不一样,6092K->448K(38400K)表示新生代大小的变化,6092K->456K(125952K)表示推内存的大小变化 后面表示用时。

[Full GC (System.gc()) [PSYoungGen: 448K->0K(38400K)] [ParOldGen: 8K->378K(87552K)] 456K->378K(125952K), [Metaspace: 3050K->3050K(1056768K)], 0.0056045 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

表示发生在老年代的gc(Major GC/Full GC) 他知识为伴随一次的新生代的gc(Minor GC),448K->0K(38400K)表示新生代内存变化,8K->378K(87552K) 老年代gc变化,456K->378K(125952K)表示gc前后堆内存的变化。

java gc日志乱码_gc原理以及gc日志剖析相关推荐

  1. idea控制台日志乱码解决,tomcat控制台日志乱码解决

    如果是启动时候日志乱码那么是idea的问题,在idea配置  打开idea所在的位置 C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin 在bi ...

  2. linux tomcat 日志乱码,Linux下TOMCAT中日志出现中文乱码

    红帽子AS4,其中TOMCAT为6.0. 结果TOMCAT中日志出现中文乱码 解决方法修改i18n: 最后的配置为: [root@linux etc]# more /etc/sysconfig/i18 ...

  3. idea server日志乱码_windows下,Kiwi_Syslog日志服务器的搭建

    最近在运维项目中遇到了需要用日志服务器来存储防火墙日志,问了好多人都不会搭建,没办法只能自己百度找教程,却没找到比较好的. 下面是我自己总结的比较简单的搭建方法: 一.Kiwi_Syslog的安装 下 ...

  4. log4j中文日志乱码--输出到文件的日志,中文部分全是问号乱码的处理

    因为业务需要,需要把保存系统操作日志,到文件中去,但是,忽然不知道怎么的,原来输出的日志都是好好的,但是后面的日志中的中文部分,都变成了问号的乱码,具体如下图: 如何处理这个问题: 在配置log输出的 ...

  5. 常见的GC算法(GC的背景与原理)

    常见的GC算法(GC的背景与原理) GC 是英文词汇Garbage Collection的缩写,中文一般直译为 "垃圾收集".当然也会说 "垃圾回收". 三种垃 ...

  6. MAVEN项目打包编译日志乱码

    很多时候IDEA在用maven在打包的时候打包编译的时候出现问题都是乱码,很不方便我们排查问题,如下: 解决办法很简单,只需要设置一下IDEA中maven编译代码的字符集即可: 依次点击:File-- ...

  7. java gc日志乱码_6000+字,30+张图。JAVA线上故障排查全套路总结。

     fredalxin|https://sourl.cn/duWZhd 线上故障主要会包括 cpu.磁盘.内存以及 网络 问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次 ...

  8. java gc日志乱码_Java中9种常见的CMS GC问题分析与解决(四)

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

  9. java 垃圾回收GC(CMS、G1)原理及调优

    概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...

最新文章

  1. R语言ggplot2可视化:使用scale_shape_identity函数显示pch点形状、使用geom_text函数为pch形状添加标(plot characters)
  2. Linux终端设备详解
  3. 算法训练营 重编码_您在编码训练营期间可能面临的最大挑战
  4. 最长递增子序列 子串_最长递增子序列
  5. [bzoj1412][ZJOI2009]狼和羊的故事
  6. 常用图像插值算法分析与比较
  7. PhysioBank简介
  8. 使用office tool plus清除office激活状态
  9. 电脑删除文件找不到该项目怎么解决
  10. Win10怎么默认用Windows照片查看程序打开图片
  11. 惊醒!北漂,你到底在漂什么?
  12. V8引擎如何回收内存以及如何优化
  13. Invalid component name: “_compiled“. Component names should conform to valid custom element name组件报错
  14. python3安装要钱吗_3b1b/manim数学动画引擎安装教程(2020-8月)
  15. 转载分享)移动金融安全风险分析与防护
  16. Java基础之刨根问底第6集——集合与List
  17. CSDN专访左程云,算法之道
  18. 数据技术初学者不用再东搜西找了,一篇文章解读20个最新数据技术概念
  19. 讲解零件生产工艺过程基本知识
  20. STM32开启和关闭总中断的方法

热门文章

  1. ACL2021 | 信息抽取相关论文
  2. 基于scikit-learn的随机森林调参实战
  3. mysql 主从 锁库_mysql 5.7.21 主从集群恢复GTID方式(不锁库)
  4. 网络相关的常用协议总结
  5. Leetcode二叉树递归:563.binary-tree-tilt(二叉树的坡度)
  6. linux 中常见的压缩和解压缩的命令
  7. 宝马与intel合作 2021年推全自动无人驾驶车
  8. 8.8 Sencha Studio 监视工具( Inspect Tool)
  9. EMC-- DFC --Sessions and Session Managers
  10. 服务器系统的安装方法,服务器的操作系统安装方法