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自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...
随机推荐
- 本地文件名大写,提交到git仓库后变成了小写
输入改命令即可: git config core.ignorecase false
- 解决dede编辑器不能保存word文档样式问题
ckeditor在dede里不能保存样式,试过多种解决办法都还是没有解决.最终将编辑器换成FCK得到解决. 第一步:下载FCK编辑器 下载地址: 链接: http://pan.baidu.com/s/ ...
- Docker系列(22)- DockerFile指令说明并构建自己的centos
DockerFile常用指令 实战测试 DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建 #创建一个自己的centos # 1.编写D ...
- jmeter之聚合报告(Aggregate Report)
jmeter最常用的listener--聚合报告Aggregate Report,每一个字段的具体含义是什么? Label:每个请求的名称.每个 JMeter 的 element(例如 HTTP Re ...
- python 正则表达式findall
re.findall("匹配规则", "要匹配的字符串") 以列表形式返回匹配到的字符串 https://www.cnblogs.com/gufengchen/ ...
- 修改为阿里的yum源
如果没有wget,先安装一个.(如果有请蹦过) yum install wget -y 备份本地yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r ...
- 密码学系列之:1Password的加密基础PBKDF2
目录 简介 PBKDF2和PBKDF1 PBKDF2的工作流程 详解PBKDF2的key生成流程 HMAC密码碰撞 PBKDF2的缺点 总结 简介 1password是一个非常优秀的密码管理软件,有了 ...
- 宝塔配置vnc+wine实现Q群机器人
图形界面必备X Window System yum -y groupinstall "X Window System" 安装epel源 yum -y install epel-re ...
- python class自身返回值研究
在python中,如果你写了这样一串代码: import datetime a = datetime.date(2021, 9, 1) b = "2021-09-01" print ...
- Idea热部署功能
什么是Idea自动热部署? 热部署是指代码改动之后,调试过程中会服务自动重启,减少手动重启的麻烦,尤其是在微服务开发中,涉及到很多模块的调试更为重要. 如何开启热部署功能? 1.添加如下依赖到项目模块 ...