JVM-堆内存
1. java堆内存介绍
java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方。
(1)jvm一起动就创建java堆。类比计算机一起动就加载内存。
(2)所有的线程共享。类比计算机所有进程共享一个内存。
(3)是存放实例对象的地方。
2. 堆内存图示

3. 堆内存划分
主要分为年轻代(占堆内存1/3)和老年代(占堆内存2/3)。年轻代又分为eden(占年轻代8/10),from(占年轻代1/10),to(占年轻代1/10)。下面开始分别介绍。
老年代:存储大对象和一些生命周期长的对象。
年轻代:存储占内存少并且生命周期短的对象。
那么问题来了,对象的大小比较好说,直接比较占的空间就行;生命周期长短,这玩意怎么算呢?这就是下面要介绍的eden,from,to
一个对象被new出来之后,是在eden中的。而new对象的操作很频繁,new的对象多了,eden装不下了,就需要对eden进行gc(垃圾回收),发生在eden中的这种小级别的gc叫做minor gc。
4. minor gc(young gc)
先介绍一下eden,from,to
eden:对象出生的地方
from:保存幸存数据的地方
to:空的幸存区
minor gc的过程如下:(参考上图红色的标线)
(1)把eden中活着的对象放到to中,并标记年龄为1。(有一部分可能会被垃圾回收掉)
(2)把from中的活着的对象 age+1(有一部分可能会被垃圾回收掉)。如果age达到阈值(默认15岁),就直接放到老年代中;如果age未达到阈值,就放到to中。
(3)经过步骤(2),to里面保存了存活的对象,from反而清空了。这时候将from和to进行标记切换,from变to,to变from。(备注:当to满了的时候,直接将to里面的数据全部放入老年代)
总结:
minor gc使用复制删除算法,能减少空间碎片。
所有的Minor GC都会停止应用程序的所有线程,不过这个过程非常短暂。
5. major gc(full gc)
采用的是标记-清除算法。
老年代的对象都是程序认为生命力比较顽强的,不是那么容易死掉的,所以没必要频繁的进行full gc。而且老年代的数据比新生代多的多,执行起来也比较耗时。
因为标记清除算法的弊端,会造成很多的内存碎片,当一个大对象进来,没有足够存储他的连续空间的时候,就会执行Full gc。执行完之后就有足够且连续的空间来存放新的对象了。
JVM-堆内存的更多相关文章
- 【转】JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM堆内存设置
今天碰到了一个题目,讲的是关于堆内存的问题,题目如下 下面哪种情况会导致持久区jvm堆内存溢出? A.循环上万次的字符串处理 B.在一段代码内申请上百M甚至上G的内存 C.使用CGLib技术直接操 ...
- JVM堆内存监测的一种方式,性能调优依旧任重道远
上月,由极客邦.InfoQ和听云联合主办2016 APMCon中国应用性能管理大会圆满落下帷幕.会上,Java冠军Martijn Verburg进行了一场Java and the Machine的分享 ...
- 巩固java(二)----JVM堆内存结构及垃圾回收机制
前言: 我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构 ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- JVM运行时数据区与JVM堆内存模型小结
前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...
- [转]JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM 堆内存设置原理(转)
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- jvm堆内存和GC简介
最近经常遇到jvm内存问题,觉得还是有必要整理下jvm内存的相关逻辑,这里只描述jvm堆内存,对外内存暂不阐述. jvm内存简图 jvm内存分为堆内存和非堆内存,堆内存分为年轻代.老年代,非堆内存里只 ...
随机推荐
- Python(3) 进制转换
2进制 :0b8进制: 0o16进制: 0x10进制:原来的数据 进制转换:bin() 方法:转化为 2进制 >>> bin(10)'0b1010'oct() 方法:转化为 8进制& ...
- 开学JAVA第一次测试
定义 ScoreInformation 类,其中包括七个私有变量(stunumber,name, mathematicsscore, englishiscore,networkscore, datab ...
- 2019年8月19日~8月25日 第八周JAVA学习总结
临近开学,本周的任务完成情况不够好,平常乱七八糟的事情比较多,所以放在学习上的心思比较少.平均每天放在JAVA学习的时间约1个小时,放在编程的时间约半小时,解决问题的时间约1小时. 下一个星期就要开学 ...
- 简单了解Spring中常用工具类_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...
- Java——this
[this] 在没有new一个对象前,this不知道指的是什么:当new出一个对象时,this指的是当前对象的引用.
- Codeforces Round #351(Div 2)
熬到半夜打结果前一个小时提交代码的页面根本加载不进去,D题写完还因为小点没判被hack掉了... rating什么的都是身外之物了,于是乎喜闻乐见地又掉回绿名了. A题: *题目描述: Bear看一场 ...
- 前向渲染使用重叠Reflection Capture 造成的反射通道接缝问题
问题出现的条件: 使用UE4 4.16 使用Forward shading 使用多个Sphere Reflection Capture组件(有重叠的部分) 烘焙灯光后能看到明显的反射通道接缝 解决办法 ...
- [ethereum源码分析](1) dubug环境搭建
前言 因为最近云小哥哥换了一份工作,新公司比较忙,所以一直没有更新新的博客.云小哥哥新的公司是做区块链的,最近在学习区块链相关的东西(也算是乘坐上了区块链这艘大船).本博客是记录我搭建ethereum ...
- RAC & MVVM 学习资料整理
最后更新:2017-01-23 参考链接: MVVM奇葩说 MVVM 介绍 Model-View-ViewModel for iOS [译] 唐巧--被误解的 MVC 和被神化的 MVVM React ...
- js刷新当前页面的5种方式
1. reload reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false, ...