JAVA虚拟机:内存回收策略及算法
java虚拟机中的程序计数器区、虚拟机栈区、本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题。
java虚拟机中的方法区和虚拟机堆区2个区是所有线程共享的区域,不同的接口或类需要的内存不同,且方法区和堆区往往是在程序运行期间进行内存动态分配或回收。GC回收器的使用范围就是对这两个区域的定义。
虚拟机堆区垃圾回收策略:
GC回收器在回收内存之前,首先要知道哪些对象可以回收,即“死去”的对象是可以回收的;哪些对象不能回收,即“存活”的对象是不能回收的,所以我们要弄明白
对象的“存活”或“死去”是怎么来判断的。
判断的策略:
1、引用计数算法:给对象中增加一个引用计数器,每当有引用此对象时,计数器加1,每当引用完毕后,计数器减1;如此计数器为0,则对象可以回收。
优点:简单,高效。
缺点:对互相引用的对象无法进行回收。
2、可达性分析算法:定义GCRoots(虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用对象、本地方法栈中引用的对象)为起始点,
从起始点开始向下搜索,搜索完毕,如果发现对象到GCroots无任何相连,则可将此对象作为可回收的对象。
GC收集器第一次发现某一对象不可达,并不会立即回收此对象,只是做一个不可达的标记,
引用计数器算法和可达性分析算法的基础都是对于对象引用的判断,引用是基础。
引用的分类:
1、强引用,GC收集器永不回收,直到引用不存在为止。
2、软引用,在系统内存溢出之前,将对这些对象进行内存回收。
3、弱引用,无论内存是否足够,都将回收此内存对象。
4、虚引用,系统会发出通知,回收此内存对象。
虚拟机方法区垃圾回收策略:
收集方法区中的常量:
收集方法区中的类:
收集条件:
1、该类所有的实例都已经被回收,也就是java堆中不存在改类的任何实例。
2、加载类的ClassLoader已经被回收
3、该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
垃圾收集算法:
1、标记-清除算法:首先通过引用可达性或者引用计数器的算法,标记出哪些对象已无引用,然后再对无引用的对象进行回收处理。
缺点:效率低,空间零碎
2、复制算法:将可用内存平均分为大小相等的两块,每次只使用一块,但此内存用完后,就将还存活的对象复制到另一块内存,把使用的那块全部回收。
商业上使用内存分为Eden区、两块Survivor区,每次只用Eden区和一块survivor区,当回收内存时,将Eden和使用的那块survivor区中还
存活的对象一次性的赋值到另一块survivor空间上,最后清理掉Eden和使用过的survivor空间,如果内存不足,则放置到永久带空间中。
3、标记-整理算法:在标记清楚算法基础上,回收完毕内存后,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4、分代收集算法:使用复制算法将新生代的内存进行回收,使用标记清理或标记整理算法将老年代的内存进行回收。
垃圾收集器:
1、Serial收集器。单线程收集器,采用复制算法,针对新生代,优点:简单高效,缺点:“stop the world"
2、ParNew收集器。多线程收集器,采用复制算法,针对新生代,优点:可以与CMS收集器配合工作(相同框架)
3、Parallel scavenge 收集器。多线程收集器,采用复制算法,针对新生代, 优点:可控吞吐量
4、CMS收集器。采用“标记-清除“算法,运行过程:初始标记,并发标记,重新标记,并发清除。优点:低停顿、并发收集 缺点:对CPU资源敏感、浮动垃圾无法一次处理、标记-清除算法碎片化内存
初始标记:标记GC Roots能直接关联到的对象,速度快。
并发标记:对GC Roots追踪
重新标记:修改并发标记期间,有变动的对象标记记录。
5、G1收集器。优点:通过并行与并发,使用多个cpu缩短stop the world停顿时间,并行是真正的同一时间多条指令同时执行,并发是同一时间段多条指令同时执行,同一时间只有一个指令在执行。
有分代收集的能力,不再需要其他收集器的配合。
空间整合。通过标记-整理算法、标记-复制算法,不存在内存碎片,收集后提供规整可用内存。
可预测的停顿。
JAVA虚拟机:内存回收策略及算法的更多相关文章
- 深入理解java虚拟机---内存分配策略(十三)
转载请注明原文地址:https://blog.csdn.net/initphp/article/details/30487407 Java内存分配策略 使用的ParNew+Serial Old收集器组 ...
- Java虚拟机内存基础、垃圾收集算法及JVM优化
1 JVM 简单结构图 1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...
- 小白请教几个关于Java虚拟机内存分配策略的问题
最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- 探秘Java虚拟机——内存管理与垃圾回收
本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...
- 探秘Java虚拟机——内存管理与垃圾回收(转)
本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...
- JAVA虚拟机内存分配与回收机制
Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现.Java虚拟机有自己想象中的硬件,如处理器.堆栈.寄存器等 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
随机推荐
- bootstrap-suggest-plugin input可选可输(表单) 好用的前端插件
bootstrap-suggest-plugin DEMO下载 1.准备:页面引入(点击下载) <link rel="stylesheet" href=&q ...
- Leetcode 12,452,455-贪心算法
Leetcode第12题,整数转罗马数字,难度中等 整个题目比较好理解,难度也不大,就算不过脑子,用一串if也基本上可以解决问题,比如 /** 执行用时:6ms,在所有 Java 提交中击败了52.6 ...
- Fleck WebSocket使用
Fleck WebSocket使用 作为笔记存储. 最近公司有这方面的使用需求.在网上查了一些资料后.得到了想要的结果.以下记录摘抄至网上资料. 1.首先,服务端.项目NuGet直接引用Fleck类库 ...
- 字符流---Day32
时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,IT界的人会不会帮我当成大佬了,哈哈哈哈,希望我以后 ...
- oracle查询连续n天登录的用户
-- 查询连续3天登录的用户 1 先创建一个表,如下: create table USER_DATA ( USER_ID NUMBER, LOGIN_TIME DATE ); 2 插入用户登录数据: ...
- PAT T1005 Programming Pattern
建立后缀数组,遍历height数组找到连续大于len的最长子序列~ #include<bits/stdc++.h> using namespace std; ; char s[maxn]; ...
- GO常量/枚举
常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier [type] = value 你可以省略类型说明符 [type],因为编 ...
- linux 服务器优化 --TIME_WAIT 问题
linux 服务器优化 --TIME_WAIT 问题: 问题现象: 1.外部机器不能正常连接SSH 2.内向外不能够正常的ping通过,域名也不能正常解析. 通过一些命令,查看服务器TIME_WAIT ...
- IDEA 在同一工作空间创建多个项目
1.创建项目 二..创建工作空间 JavaWorkspace 1.File-> New Project -> 创建工作空间 JavaWorkspace,并 顺便创建项目 JavaOne 2 ...
- Git远程分支代码强制回退&Tag添加
Git指令大全:https://www.alexkras.com/getting-started-with-git/ Git提交错了,还是Master分支,哎呦喂咋整?请见下文. [场景描述] 项 ...