java 垃圾回收及内存分配策略
一、在垃圾收集器对堆进行回收前,首先需要判断对象是否“存活”,对已经“死去”的对象进行回收
判断对象是否存活:引用计数法和可达性分析法
引用计数法:给对象添加一个引用计数器,每当有地方引用它时,计数器加1;当引用失效时减1,任何时候计数器为0则表示没有引用。
可达性分析法:通过称为“GC Roots”的对象作为起始点,从这些节点往下搜索,当一个对象无法连接到“GC Roots”说明此对象是可回收的。
二、垃圾收集算法:
1标记清除算法【不足:标记和清除的效率都不高;标记清除后会产生大量不连续的内存碎片】
2复制算法【为了解决效率问题。将内存分为大小相等的两块,每次使用其中一块,满了,把第一块中存活的对象复制到另一块上,然后把使用过的内存一次清理掉。不足:内存缩小为原来的一半】ps:现在的商业虚拟机都采用这种算法回收新生代,只是未按1:1来分割,熟悉的Eden和survivor就是这种算法。
3.标记整理算法【复制算法在对象存活率较高的时候就会进行更多的复制操作效率会变低所以不适用于老年代,标记整理是指把存活的对象向一端移动,然后直接清除端边界以外的内存】
4.分代收集算法【本质是标记清除算法、复制算法、标记整理算法的联合,把内存分为新生代和老年代,然后在新生代用复制算法,在老年代用标记清除或标记整理】
三、内存分配与回收策略
1对象优先分配在eden区
2大对象直接进入老年代
3长期存活的对象将进入老年代【虚拟机给每个对象定义了一个年龄计数器,每经历过一次minor GC年龄就增加1岁,超过一定程度移动到老年代】
4.动态对象年龄判定【虚拟机并不是永远要求对象的年龄必须达到一定的程度才能晋升老年代,如果survivor空间中相同年龄的所有对象大小之和大于survivor空间的一半,则把大于等于该年龄的对象移动到老年代】
5.空间分配担保【在发生minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果大于那么可以确保minor GC是安全的;如果不大于,则判断是否允许担保失败,如果允许,检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则进行minor GC,如果小于或者不允许担保失败,则进行一次Full GC】
java 垃圾回收及内存分配策略的更多相关文章
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- Java的垃圾回收和内存分配策略
本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...
- [jvm]垃圾回收与内存分配策略
一.垃圾回收算法 概述 JVM中,当创建的对象不再被使用的时候,此时我们认为他是无用的“垃圾”:在现代主流的商用jvm中,都是通过可达性分析来判断对象是否存活的.这个算法的基本思想是通过一系列“GCR ...
- Java垃圾回收以及内存分配
http://www.cnblogs.com/ggjucheng/p/3977384.html http://www.blogjava.net/qcyycom/archive/2012/04/14/3 ...
- Java垃圾回收机制(GC策略)
Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时 ...
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...
- Java GC 垃圾回收算法 内存分配
垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...
随机推荐
- Thinkphp5 主动式 计划任务 支持windows和linux
百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这 ...
- Elasticsearch(ES)集群的搭建
1. 概述 Elasticsearch(ES)集群支持分片和副本,能够很容易的实现负载均衡.扩容.容灾.高可用. 今天我们就来聊一下,Elasticsearch(ES)集群是如何搭建的. 2. 场景介 ...
- delete,drop,truncate 区别
今天看到一篇关于delete.drop.truncate区别的文章,认为写得非常好,转过来. 打比方很形象. delete,drop,truncate 都有删除表的作用,区别在于: 1.delete ...
- ggplot2 画图随笔
ggplot2 盒图+显著性线 compire <- list(c('1','2'),c('1','4')) ggplot(info,aes(x=cluster,y=value))+ stat_ ...
- [转载]ssh证书登录
转载链接 前言 本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的 ...
- 开机延时启动多程序(Dos下Start命令详解)
前言 在实际开发当中,很多程序需要开机自启,并且对启动顺序有所要求,这里推荐一种最简单的开机延时启动多程序的方法,使用bat脚本来控制程序的启动顺序. Bat脚本实现 Bat比较简单,延时是采用pin ...
- Go语言之函数
函数就是一块执行特定任务的代码,在输入源的基础上通过一些算法生成预期的输出. 一.函数的声明 Go 语言中的函数声明语法如下: func 函数名(参数名 类型,参数名 类型)(返回值1类型,返回值2类 ...
- 小记SpringMVC与SpringBoot 的controller的返回json数据的不同
近期由于项目的改动变更,在使用springmvc和springboot测试的时候发现一个有趣的现象 1.springmvc的controller使用@ResponseBody返回的仅仅是json格式的 ...
- 【vue】使用 Video.js 播放视频
目录 安装 引入 使用 参考文档 环境: vue 2.0+ element ui (这里的代码用了elmentui的按钮样式,可以不用elment ui的样式) 安装 在项目中安装 video.js. ...
- 聊聊我对 GraphQL 的一些认知
每隔一段时间就能看到一篇 GraphQL 的文章,但是打开文章一看,基本上就是简单的介绍下 GraphQL 的特性.很多文章其实就是 github 上找个 GraphQL 的项目,然后按照对应的 de ...