jvm内存分配和回收策略
在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自《深入理解Java虚拟机》一书)
java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题--给对象分配内存以及回收分配给对象的内存.我们下面就来介绍这些是怎么自动化完成的.
下面继续提出问题:
1.怎么判断对象是否能被回收?
2.垃圾回收是怎么进行的?
3.方法区存在垃圾回收吗?
4.垃圾回收都有什么算法?
5.MinorGC,FullGC,新生代,老年代,永久代,Eden,Survivor 这些名词都是什么意思?
6.内存分配策略(规则)是什么?
下面来解决问题:
1.怎么判断对象是否能被回收?
java是采用的跟搜索算法(GC Roots Tracing)来判定对象是否存活.简单讲就是如果一个对象到 根节点之间不可达时,就可以被回收了.
那么问题来了.根节点是什么呢? 在java语言里,能做根节点的包括下面几种:
1) 虚拟机栈中的引用对象
2) 方法区中的类静态属性引用的对象
3) 方法区中的常量引用的对象
4)本地方法栈JNI(即Native方法)的引用的对象.
这里需要说明一下,上面所说的引用,都是指的强引用. 我们知道java中引用有四种.强,软,弱,虚.我们平常的引用都是指的强引用,像缓存一般使用软引用来实现.
2.垃圾回收是怎么进行的?
上面一点讲了怎么判断一个对象是否能被回收,那么是否能被回收,就一定会被回收呢? 当然不是.
首先垃圾回收行为是不确定什么时候执行的. 其次.回收一个对象,至少要经理两次标记过程:
1)判断对象是否与GC Roots之间有引用链
2)如果没有,则进行第一次标记,并按此对象是否需要执行finalize()方法进行筛选.
3)如果对象不需要执行finalize()方法,则第二次标记为可回收.此时真正可回收.
4)如果需要执行finalize()方法,则会被放在一个F-Queue队列中去执行,稍后GC将对F-Queue中的对象进行二次标记.如果成功拯救自己(譬如把自己赋值给某个引用链上的对象),则会在标记中移除. 如果没能拯救,则此时真正可回收.
另外说下.《深入理解Java虚拟机》一书建议我们忘掉 finalize()这个方法.
3.方法区存在垃圾回收吗?
方法区在HotSpot虚拟机中又名永久代, 永久代还存在或者说还需要垃圾回收吗?
这个区域是存在垃圾回收的,但是垃圾回收的效率比较低.就是说回收一次释放不了多少空间.永久代主要回收内容是 废弃常量和无用的类.
在大量使用反射,动态代理,CGLib等bytecode框架的场景,以及动态生成JSP和OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备回收无用的类的功能.以保障永久代不溢出.
4.垃圾回收都有什么算法?
常用的算法 标记-清除算法,复制算法,标记-整理算法. 分代收集算法.
前面3种算法,各有优缺点,分代收集算法其实只是把java堆分成了几块,每块使用前面算法中最适合的算法.
垃圾回收器也有很多种.具体可以看《深入理解Java虚拟机》一书
5.新生代,老年代,永久代,Eden,Survivor ,MinorGC,FullGC,这些名词都是什么意思?
让我们打开jdk/bin/jvisualvm.exe 这个工具,装上Visual GC 这个插件.打开后如下图,是我eclipse运行时的截图.
整个jvm内存情况在图中都有显示,
Perm 就是方法区,也称为永久代.
Old+Eden+S0+S1 = 堆. Eden+S0+S1 = Young
Old 就是老年代, Young就是新生代.
S0和S1中一定会有一个为空,这是因为垃圾回收算法决定的(复制算法)HotSpot默认的S0,S1与Eden的大小比例为1:8.
Eden区满后,会触发MinorGC(新生代GC),Old区满后会触发FullGC(老年代GC,Major GC). (注意不一定是存满才触发.)
新生代GC比较频繁,但是回收速度也快,老年代GC理论上不会太频繁,但是回收速度比较慢.(对应图中,GC time 21次,1.251s,全部都是Eden区发生的,OldGen区没有发生FullGC)
为什么新生代还要细分为Eden,Survivor0,Survivor1呢? 其实这都是为了配合垃圾回收算法来分的.
6.java内存分配策略是什么?
其实从上面的对堆的划分,就大概能了解到java内存是怎么分的了.
简单讲就是优先分配在Eden区, 如果经历了一些回收后,还没死掉,那么就有资格进入到Old区. 又或者有些比较大的对象,直接就分配在Old区.
上面说的是堆的内存分配, 栈的内存分配就更简单了.java栈的分配是和线程绑定在一起的,创建一个线程时,就会为这个线程创建一个栈,
从栈和堆的功能和作用来比较,堆主要用来存放对象,栈主要用来执行程序.
垃圾回收和分配的说完了, 很多细的东西都没说,因为现阶段感觉还用不到,也不容易理解.
jvm内存分配和回收策略的更多相关文章
- JVM 内存分配和回收策略
对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不 ...
- A4. JVM 内存分配及回收策略
[概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...
- JVM——内存分配与回收策略
1.对象优先在Eden区分配 大多数情况下,对象在新生代Eden区分配.当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC. 虚拟机提供了 -XX:+PrintGCDetails这 ...
- JVM内存分配与回收策略
对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作 ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- JVM垃圾回收器、内存分配与回收策略
新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...
- JVM学习十 -(复习)内存分配与回收策略
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...
- 最简单例子图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- 最简单例子图解JVM内存分配和回收(转)
本文转自http://ifeve.com/a-simple-example-demo-jvm-allocation-and-gc/ http://www.idouba.net/a-simple-exa ...
随机推荐
- Day-6: 函数式编程
函数式编程就是封装成一个个函数,一次调用来完成复杂任务. 函数式编程的一个特点是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 高阶函数 高阶函数就是将函数的变量名作为参数传入,内部再对 ...
- 解决:"不再sudoers文件中,此事将不做被报告”的问题
使用sudo出现问题:不再sudoers文件中,此事将不做被报告 系统:win8.1 +cents 7 问题:在虚拟机中,默认不是root账号,在使用sudo命令时候收到下面警告: sudo命令含义: ...
- struts2和spring mvc的比较
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236 Struts2 Springmvc 机制 基于filt ...
- spring boot认识
Spring Boot的好处: 1.配置简化 2.配合各种starter使用,基本上可以做到自动化配置 3.上手速度快 4.提供运行时的应用监控 运用IDEA创建spring boot项目请查看: h ...
- 第3阶段——内核启动分析之prepare_namespace()如何挂载根文件系统和mtd分区介绍(6)
内核启动并初始化后,最终目的是像Windows一样能启动应用程序,在windows中每个应用程序都存在C盘.D盘等,而linux中每个应用程序是存放在根文件系统里面,那么挂载根文件系统在哪里,怎么实现 ...
- poj 3613 floyd + 快速幂
题意:本题的大意就是问从S 到 T 经过边得个数恰为k的最短路是多少. 思路:对于邻接矩阵每一次floyd求的是每个点间的最短距离,则n次floyd就是每个点间n条路的最短距离(可以重复边); 但是由 ...
- JavaScript学习日志(五):DOM
一,基本定义 DOM是针对HTML和XML文档的API,根据W3C的HTML DOM标准,html文档中所以内容(无论是元素还是标签还是注释还是元素属性)都是节点. 二,Node类型:每一个节点都含有 ...
- 算法学习:Pac-Man的简单对抗
Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台.其主体利用python完成.该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用. http://ai.ber ...
- 转:【Java集合源码剖析】HashMap源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...
- (转)C语言malloc()与free()的使用
如何使用 malloc 函数 本文为转载内容,原文地址请点击 不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程.malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要 ...