文档章节

垃圾回收与内存分配策略

Original123
 Original123
发布于 2017/03/20 14:01
字数 834
阅读 1
收藏 0

一,概述

GC 要完成的三部分内容

  1.  哪些内存需要回收
  2. 什么时候回收?
  3. 怎么回收?

二,如何判断哪些对象是可以回收的?

  • 引用计数算法

            定义:给每个对象添加一个引用计数器,每当有地方引用他,引用+1,引用失效,引用-1

                如下代码,说明这个算法在java中不适用,如果两个对象相互引用,

                

public Object instance = null;

	@Test
	public void test() {

		JedisTest app1 = new JedisTest();
		JedisTest app2 = new JedisTest();

		app1.instance = app2;

		app2.instance = app1;

		app1 = null;
		app2 = null;

		System.gc();

	}

查看gc日志如下:

Java HotSpot(TM) 64-Bit Server VM (25.101-b13) for windows-amd64 JRE (1.8.0_101-b13),
 built on Jun 22 2016 01:21:29 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 7802108k(1701208k free), swap 15602380k(7224188k free)
CommandLine flags: -XX:InitialHeapSize=124833728 -XX:MaxHeapSize=1997339648 
-XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 
1.870: [GC (System.gc())  13530K->3243K(117760K), 0.0107684 secs]
1.881: [Full GC (System.gc())  3243K->3111K(117760K), 0.0447528 secs]
  • 可达性分析算法

        可达性分析算法的思路:从这些节点往下搜索,搜索所走过的路径成为引用链,当一个对象到GC ROOTS没有任何一个引用链项链,则证明此对象不可用.

        GC ROOT 包含以下几个部分:

  • 虚拟机栈引用的对象
  • 方法区类静态属性引用的对象.
  • 方法去常量引用的对象
  • 本地方法栈native方法引用的对象
  • 引用的深刻分析?

        目前引用分为四种形式:

  

  • 生存还是死亡?

        要真正宣告一个对象死亡,必须要进行两次标记过程,如果对象在进行可行性分析后没有GC ROOT 没有他关联,那他进行进行第一次标记并且进行第一次筛选,筛选的条件是该对象是否有必要执行finalize方法,

如下是时序图:

  • 回收方法区

回收方法区主要包含两部分内容:常量池和类

常量池里的常量只有没有被引用,一段时间会被JVM回收

判定一个类是否被回收,需要满足以下三个条件:

  • 该类的实例已经全部没有被引用
  • 该类的加载器已经没有被引用
  • 该类的类型java.lang.Class 没有别引用.

三,垃圾回收算法

  • 标记-清除算法

        先标记,后清除,

            优点:效率快,节省时间

            缺点:内存地址都不是连续的

  • 复制算法

            实现原理:

                将内存按大小分为相等的A和B,使用时,先使用A,待A内存满了,将A中存活的对象复制到B,然后整体清除A.

                优点:内存地址连续

                缺点:可用内存为原来一半,浪费内存.

现在商业JVM都是采取复制算法清除内存,JVM分为Eden 和 Surivivor,Surivivor又分为from和to,Eden和SURivovor内存比为8:1,

  • 标记整理算法

            标记整理算法是JVM老年代的清理办法,算法和标记-清除算法一致,但后续步骤不是对对象直接清除,而是让所有存活的对象向一个方向移动,然后清除掉边界以外的内存.

  • 分代收集算法

    分带收集算法:年轻代-复制算法,老年带-标记-清理算法.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

Original123
粉丝 7
博文 66
码字总数 87205
作品 0
徐汇
架构师
私信 提问
ART虚拟机GC原理分析讲解

1.垃圾回收机制 垃圾回收机制全称为Garbage Collection,简称GC,是Android系统中虚拟机提供的一套自动内存管理机制。 传统的C/C++是没有GC的,初始化对象然后分配内存空间需要手动地malloc/...

ART
2017/12/06
0
0
技术晨读_20160217

技术导读 Build a RESTful API with Martini 使用martini搭建一个Restful API,使用的是简易的内存database,搭建了一套支持json和xml的RESTFUL的API http://0value.com/build-a-restful-API...

王二狗子11
2018/01/07
0
0
Go 语言的手工内存管理

介绍 注:如果您对这篇文章有不同观点,欢迎指正 - 我并不是这方面的专家。 我们从大量的 go 用户中收集了有关于使用 defer 和 panic 的性能统计。不像其它的 APM/error 记录公司,我们的重点...

oschina
2015/05/18
5.6K
14
浅谈 JavaScript 内存管理与垃圾回收

写过的都清楚,我们需要时时刻刻关心处理程序的内存使用情况,这无形的给程序员增添了很多负担,但是在后期出现的一些语言中渐渐的都加入了内存自动管理和垃圾回收机制,这样一来我们就不必再...

Baoyuan
05/16
0
0
Android性能优化:关于 内存泄露 的知识都在这里了!

前言 在中,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用 本文 全面介绍了内存泄露的本质、原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜欢。 目录 } Li...

Carson_Ho
2018/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
23分钟前
5
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
26分钟前
4
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
27分钟前
3
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
30分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
33分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部