JVM-垃圾收集算法
新生代:复制算法,IBM研究过,约98%对象是“朝生夕死”,所以不需要按照1:1来划分;HotSpot中默认是8:1:1,即每次新生代可用空间为90%,只有10%会被“浪费”,
当Survivor空间不够时,需要依赖老年代进行分配担保。
1.标记-清除算法(Mark-Sweep) | 2.复制算法(Copying) | 3.标记-整理算法(Mark-Compact) | 4.分代收集算法(Generational Collection) | |
简介 | 最基础 | 为解决1的效率问题; | ||
实现方案 |
将内存分为相等的2个部分, 当1块用完后,将存活对象复制到另1块上, 然后一次清理掉已用那块; |
先标记, 再让所有存活的对象都向一端移动, 清除掉端边界以外的内存; |
新生代:对象存活率低,有老年代作为担保; -->复制算法 老年代:对象存活率高,无额外空间担保; -->标记-清除、标记-整理孙 |
|
优点 | 当对象存活率很低,约10%以内,效率高 | |||
缺点 |
1.效率问题,标记和清除两个过程效率都不高; 2.空间问题,产生内存碎片,可能会影响大对象的分配,导致提前触发GC; |
1.将内存缩小为原来的一半; 2.当对象存活率较高时,就要进行较多的复制操作,效率变低; |
||
适用领域 |
多用于新生代, 将Eden和From区存活对象移动到To区, 然后清除Eden和From区, 老年代作为担保; |
JVM-垃圾收集算法的更多相关文章
- JVM垃圾收集算法(标记-清除、复制、标记-整理)
[JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间 ...
- JVM垃圾收集算法
JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效 ...
- JVM垃圾收集算法之标记算法
前言 总所周知,jvm的垃圾收集算法一般包括标记.清除.整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解. 垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法. 引用记数 ...
- 【004】【JVM——垃圾收集算法】
Java虚拟机学习总结文件夹 垃圾收集算法 垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程. 标记-清除算法 垃圾收集 ...
- [jvm] -- 垃圾收集算法篇
垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同 ...
- JVM垃圾收集算法之清除算法
最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识.我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际 ...
- JVM 垃圾收集算法 标记-清楚、标记-复制、标记-整理
摘要 Java程序在运行过程中会产生大量的对象,但是内存大小是有限的,如果光用而不释放,那内存迟早被耗尽.如C.C++程序,需要程序员手动释放内存,Java则不需要,是由垃圾回收器去自动回收. 垃圾回 ...
- JVM——垃圾收集算法及垃圾回收器
一.垃圾回收算法 1.标记-清除算法 1)工作流程 算法分为"标记"和"清除"阶段:首先标记出所有需要回收的对象(标记阶段),在标记完成后统一回收所有被标记的对 ...
- JVM——垃圾收集算法
1.标记-清除算法 最基础的收集算法,如其名,算法为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 两个不足: 1)效率问题,标记和清除两个过程的效率 ...
- JVM垃圾收集算法——分代收集算法
分代收集算法(Generational Collection): 当前商业虚拟机的垃圾收集都采用"分代收集算法". 这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分 ...
随机推荐
- [RESTful] 项目设计实践
有以下的项目需求 用户登录.注册 文章发表.编辑.管理.列表 一.资源路径 /users./articles 二.HTTP动词 GET.POST.DELETE.PUT 三.过滤信息 文章的分页筛选 四 ...
- windows下安装memcached,报错:Failed to ignore SIGHUP RESULT too large
小平板不想装虚拟机, 但是却跑不起memcached 网上虽有解决方案,但都只有一条命令, 没有出处. 翻了半天, 找到这个连接 https://commaster.net/content/insta ...
- makefile笔记7 - makefile函数
在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能. make 所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使用. ...
- puthon文件头
#!/usr/bin/u/ubv/a python # -*- coding:utf-8 -*-
- IDEA Maven项目默认编译器使用JDK1.5的解决办法
在idea中创建maven项目,项目指定用jdk1.8编译,每次更新maven库后,都会重新变成1.5.解决方案: 第一种: 在pom文件中,增加如下代码: <properties> &l ...
- MySQL80修改密码
mysql> update user set password=password('123') where user='root' and host='localhost'; ERROR 106 ...
- C# receive 接收的字符串 对比不相等的问题
背景: 最近写了一个C/S架构的 C# Socket 通讯项目,服务端,客户端弄通了之后,客户端发送给服务端后,服务端回复一个字符串告诉客户端确认收到了.问题就在这. 问题: 一开始,我让服务端回复了 ...
- JdbcTemplate 配置多数据源(完全照抄,完整)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 配置3层交换机VLAN间通信
SW2 Switch>en Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(c ...
- ubuntu编译安装opencv
简易安装opencv2: conda install --channel https://conda.anaconda.org/menpo opencv 或: sudo apt-get install ...