java gc 随记
gc为garbage collection的缩写,中文翻译为垃圾回收。垃圾为不在使用的实例、变量,回收为释放垃圾所占用的内存空间。
学习过的C语言、C++语言,是没有垃圾回收机制的,因此需要软件工程师通过编写代码释放无用变量或实例占用的内存空间。人为操作会存在遗漏的问题,因此有时会出现内存泄露等问题。
jvm中的堆是主要的内存分配区域,jvm的gc工作区域也主要在这一片内存中。
如何判断哪些内存需要回收?
引用计数法
通过记录实例变量被引用的次数,可知不再使用的内存。但是如果存在交叉引用的情况,就会出现内存泄露的问题。
可达性分析法
通过一系列称为GC Roots的实例作为起点,逐步向下递归搜索各自引用的实例,搜索所走过的路径称为引用链。当一个实例不在GC Roots为起点的引用链时,证明此实例不再被使用,其内存空间可被回收。
GCRoots包含四个部分:
- 虚拟机栈本地变量表中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象
四种引用方式:强引用,软引用,弱引用,虚引用
如何垃圾回收?
标记-清除:两个阶段,会产生内存碎片。
标记-复制:内存空间分为两个部分,将标记后存活的实例复制到另一片内存空间中,另一片内存空间清空。
标记-整理:改变标记-清除算法的内存碎片问题,将存活实例整理在一起。
分代整理:分为年轻代内存空间和老年代内存空间,年轻代内存中的对象能存活下来的很少,使用标记-复制算法,年老代内存中的对象内存储下来的较多,使用标记-清除或标记-整理算法。
由谁执行垃圾回收?
serial收集器
使用单线程标记-复制算法进行垃圾回收,程序会暂停。
ParNew收集器
Serial收集器的多线程版本,程序依然会暂停。
Parallel Scavenge收集器
类似ParNew收集器,可动态调节垃圾回收时的停顿时间,吞吐量。程序依然暂停,但暂停时间可预估。
Serial Old收集器、Parallel Old收集器
单线程版、多线程版,标记-清除算法,程序会暂停
CMS收集器
分四个阶段
(1). 初始标记,标记GCRoots能直接关联到的对象,时间很短。程序暂停
(2). 并发标记,进行GCRoots Tracing(可达性分析)过程,时间很长。程序不暂停
(3). 重新标记,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长。程序暂停
(4). 并发清除,回收内存空间,时间很长。程序不暂停
java gc 随记的更多相关文章
- Java GC回收机制
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...
- Java GC性能优化实战
GC优化是必要的吗? 或者更准确地说,GC优化对Java基础服务来说是必要的吗?答案是否定的,事实上GC优化对Java基础服务来说在有些场合是可以省去的,但前提是这些正在运行的Java系统,必须包含以 ...
- [面试] Java GC (未整理完)
Java GC简介 什么是 GC ? Java程序不用像C++程序在程序中自行处理内存的回收释放.这是因为Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...
- [转]Java GC的原理
Java GC(garbage collection,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里 ...
- Java GC的原理
Java GC(garbage collec,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里讲的分代 ...
- (转)Java GC基本算法
http://blog.csdn.net/heyutao007/article/details/38151581 1.引用计数(reference counting) 原理:此对象有一个引用,则 ...
- jvm系列(七):如何优化Java GC「译」
本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...
随机推荐
- [HNOI2010] 合唱队
题目链接:https://www.luogu.org/problemnew/show/P3205 一个区间DP的题目. 设计状态为:\(dp1[i][j]\)表示当前区间为\([i,j]\),而且最后 ...
- iOS去除api过期警告提示
1.问题描述 应用最低支持版本调高,导致部分旧的代码中API出现警告. 2.解决问题 使用以下代码夹住过期的API部分代码即可解决该问题. #pragma clang diagnostic push ...
- [AGC003F] Fraction of Fractal 矩阵快速幂
Description SnukeSnuke从他的母亲那里得到了生日礼物--一个网格.网格有HH行WW列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过 ...
- [ActionScript 3.0] AS3实现3D旋转
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Display ...
- Your branch is ahead of 'origin/master' by 1 commit.
git reset HEAD^ --soft git reset HEAD^ --hard --soft 表示保留当前commit,重新commit --hard 表示丢弃当前add,重新add.co ...
- myeclipse部署项目到tomcat-custom_location 方式
在想要部署的路径下:1.新建一个在tomcat--->server.xml文件夹下设置的文件名 2.在新建的文件夹下新建一个 ROOT文件夹, 3.在myeclipse里面吧项目部署到 ROO ...
- 本地搭建GitLab
现在很多企业都开始使用gitLab,因为他的权限管理强大,后台项目管理也很方便.下面就介绍本地搭建方法: 为避免损失,建议在虚拟机测试.虚拟机最低配置(内存2G,cpu:2核,硬盘:20G) 1.安装 ...
- php中签名公钥、私钥(SHA1withRSA签名)以及AES(AES/ECB/PKCS5Padding)加密解密详解
由于http请求是无状态,所以我们不知道请求方到底是谁.于是就诞生了签名,接收方和请求方协商一种签名方式进行验证,来取得互相信任,进行下一步业务逻辑交流. 其中签名用得很多的就是公钥私钥,用私钥签名, ...
- python 控制台输出带颜色的文字的方法
python_控制台输出带颜色的文字方法 在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信 ...
- 基础篇:3.2)规范化:3d零件建模
本章目的:规范化零件建模,这是机械的基本功夫. 1.建模的总体原则和总体要求 1.1 建模总体原则 a)零件模型应能准确表达零件的设计信息:b)零件模型包含零件的几何要素.约束要素和工程要素:c)零件 ...