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 ...
随机推荐
- MariaDB体验2----CSV文件导入
之前已经安装好MariaDB,现在需要将一份从Sql Server数据库里面导出的CSV文件导入进MariaDB,期间碰到了各种坑,这里记录一下. HeidiSQL的导入CSV文件的地方在“工具”栏, ...
- 微信iOS收款到账语音提醒开发总结
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者:l ...
- Redis在java中的使用
1.首先安装Redis环境.可以在Windows.linux.别的服务器上搭建Redis环境 2.在java工程中导入必须的jar包 如maven上导入两个jar] <!-- Redis必须包 ...
- C++中关于重载默认构造函数与默认全部参数的构造函数的使用注意
# include<iostream>using namespace std;class Time{public: //公用成员函数 ...
- web服务的三大主流架构
1.远程过程调用 2.服务导向架构 3.表述性状态转移 今天在自学Spring架构时貌似发现 rest的表现.与RPC方式的最大差别,SOA方式更加关注如何去连接服务而不是去特定某个实现的细节.而re ...
- 【beta】阶段 第六次 Scrum Meeting
每日任务 1.本次会议为第六次 Meeting会议: 2.本次会议在周六上午大课间,在陆大楼召开,召开本次会议为15分钟. 一.今日站立式会议照片 二.每个人的工作 (有work item 的ID) ...
- java中null的类型匹配
null作为一个特殊的参数匹配为String对象
- 【Beta阶段】第六次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 着手联网功能 100% 配合100完成联网功能 100 DEV 完善服务器 ...
- Swing-选项卡面板JTabbedPane-入门
注:非原创,内容源自<Swing 的选项卡面板>,笔者做了少量修改. 选项卡面板是一个很常用的Swing组件,在window下,右击我的电脑,查看属性,就是一个典型的选修卡面板.当然还有最 ...
- 201521123025《java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有执行过try语句块,finall ...