Java堆内存划分
根据对象的存活率(年龄)Java堆内存划分为3种,新生代,老年代,永久代;
1.新生代
比如我们在方法中区new一个对象,那这方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。
现在的商业虚拟机都采用这种手机算法来回收新生代,新生代中的对象98%都是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块比较小的Survivor空间,每次使用Eden和其中一块Survivor。当会收拾,将Eden和Survivor中还存活的对象一次性放复制到另一块Survivor空间上,最后清理到Eden和刚才用过的Survivor空间,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%)只有10%的空间会被浪费。
当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代。同事,长期存活的对象将进入老年代(虚拟机给每隔对象定义一个年龄计数器)。
来看下面一张图

Minor GC和Full GC
Minor GC:
Minor GC是发生在新生代中的垃圾收集动作,采用的是复制算法。
对象在Eden和From区出生后,在经过一次Minor GC后,如果对象还存活,并且能够被to区所收容,那么在使用复制算法时这些存活的对象就会被复制到to区域,然后清理掉Eden区域和from区域,并将这些对象的年龄设置为1,以后对象在Survivor区域每熬过一次MinorGC,就将对象的年龄加1,当对象的年龄到达某个值时(默认是15岁,可以通过-xx:maxtenuring threshold设置),这些对象就会成为老年代。
但是这也是不一定的,对于一些较大的对象(即需要分配一块较大的拦蓄内存空间)则是直接进入老年代。
Full GC:
Full GC是发生在老年代的来及回收收集动作,采用的是标记-清除、清理算法。
老年代里的对象几乎是在Survivor区熬过啦的,不会那么容易死掉。因为Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比做一次Minor GC的时间长。
另外,如果采用的是标记清除算法的话为产生讯多碎片,伺候如果需要为较大的对象分配内存时,若无法找到足够的连续的内存空间,就会提前出发一次GC。
2.老年代
在新生代中经理了N次垃圾回收后任然存货的对象就会被放到老年代中。而且大对象直接进入老年代。
3.永久代
即方法区。
Java堆内存划分的更多相关文章
- java堆内存详解
		http://www.importnew.com/14630.htmljava堆的特点<深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机所管 ... 
- JDK8中JVM堆内存划分
		一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ... 
- Java堆内存又溢出了!教你一招必杀技
		JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ... 
- Java堆内存的十个要点
		Java中的堆空间是什么? 当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或 ... 
- (2)java堆内存
		java堆内存结构图 [名词解释]--->eden,so,s1通称为新生代对象储区--->tenured称为老年代对象存储区--->s0和s1也称为from和to区域,是两块大小相等 ... 
- 关于java堆内存溢出的几种情况(转)
		[情况一]: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环: 如果是java堆内存不够 ... 
- Java堆内存溢出模拟
		先了解一下Java堆: 关于Java内存区域的分配,可以查看Java运行时数据区域一篇文章. Java堆是虚拟机内存管理中最大的一块区域,该区域是线程共享的,某Java进程中所有的线程都可以访问该区域 ... 
- Java堆内存不足
		1)使用IDEA开发程序时有时候会提示“Java Heap space error”,说明IDEA默认配置的Java堆内存不足,程序需要更多的堆内存. 2)堆(Heap)和非堆(Non-heap)内存 ... 
- Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?
		Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival. 首先第一个问题:为什么要有Survival区? ... 
随机推荐
- EntityFramework 学习 一  Entity Framework  查询设计
			First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ... 
- Docker-使用Dockerfile创建镜像
			Dockerfile是一个文本格式的配置文件,用户可以使用Docker来快速创建自定义的镜像 基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行 一般而言,Dockerfil ... 
- Html 表单表格 form table
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- float,double与long long哪个更大?
			float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38: double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+ ... 
- How to reduce Index size on disk?减少ES索引大小的一些小手段
			ES索引文件瘦身总结如下: 原始数据:(1)学习splunk,原始data存big string(2)原始文件还可以再度压缩倒排索引:(1)去掉不必要的倒排索引信息:例如文件位置倒排._source和 ... 
- (转)Java字符串转日期或日期转字符串
			文章中,用的API是SimpleDateFormat,它是属于java.text.SimpleDateFormat,所以请记得import进 来! 用法: SimpleDateFormat sdf = ... 
- 用截取的部分图像创建新图像--关于cvGetSubRect,cvGetImage的用法
			CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect)可以把截取图像中需要的区域存入矩阵.把IplImage *传给arr, ... 
- codeforces 632B B. Alice, Bob, Two Teams(暴力)
			B. Alice, Bob, Two Teams time limit per test 1.5 seconds memory limit per test 256 megabytes input s ... 
- Json解析方式
			http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html 
- PPAS数据库备份与恢复
			PPAS数据库备份不同于普通的Postgresql数据库的备份,因为PPAS数据库是兼容Oracle数据库的,所以会涉及到同义词.包.存储过程等,这个时候用Postgresql社区的备份与恢复工具时, ... 
