根据对象的存活率(年龄)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堆内存划分的更多相关文章

  1. java堆内存详解

    http://www.importnew.com/14630.htmljava堆的特点<深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机所管 ...

  2. JDK8中JVM堆内存划分

    一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...

  3. Java堆内存又溢出了!教你一招必杀技

    JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...

  4. Java堆内存的十个要点

    Java中的堆空间是什么? 当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或 ...

  5. (2)java堆内存

    java堆内存结构图 [名词解释]--->eden,so,s1通称为新生代对象储区--->tenured称为老年代对象存储区--->s0和s1也称为from和to区域,是两块大小相等 ...

  6. 关于java堆内存溢出的几种情况(转)

    [情况一]: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环: 如果是java堆内存不够 ...

  7. Java堆内存溢出模拟

    先了解一下Java堆: 关于Java内存区域的分配,可以查看Java运行时数据区域一篇文章. Java堆是虚拟机内存管理中最大的一块区域,该区域是线程共享的,某Java进程中所有的线程都可以访问该区域 ...

  8. Java堆内存不足

    1)使用IDEA开发程序时有时候会提示“Java Heap space error”,说明IDEA默认配置的Java堆内存不足,程序需要更多的堆内存. 2)堆(Heap)和非堆(Non-heap)内存 ...

  9. Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?

    Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival. 首先第一个问题:为什么要有Survival区? ...

随机推荐

  1. Ubuntu14 下安装jdk1.8

    1.oracle官网下载jdk-8u45-linux-i586.gz 此为32位 2.放在任意目录下,如/home/hongxf 3.直接解压该文件 sudo tar -xvf jdk-8u45-li ...

  2. 关于使用unigui、webxone、mysql的几个问题

    一.webxone的问题:1.目前稳定可用的版本好像是v2510:2.设计webxone应用时,窗口的“position”属性只能设置为poDesigned,而且不能动态改变窗口尺寸,否则在浏览器中显 ...

  3. spring+mybatis的事务配置

    出自:http://kinglixing.blog.51cto.com/3421535/723870 定义一个实体类:Emp.java package com.lixing.scm.entity; p ...

  4. BEC listen and translation exercise 41

    Its advantages are that it can be used for outside activities So my recommendation I'm afraid would ...

  5. conda 里的 jupyter

    1. 安装conda https://mirrors.tuna.tsinghua.edu.cn/anaconda/ 下载并安装. 2. 安装jupyter (1)在ananconda主环境安装:pip ...

  6. JDBC获得数据库连接及使用

    1.Connection  Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口.这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现 在程序中不需要直接去访问实现了 ...

  7. OpenCV——饱和度调整

    参考: 闲人阿发伯的博客 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED ...

  8. 什么是DMIPS

    MIPS: Million Instructions executed Per Second,每秒百万条指令,用来计算同一秒内系统的处理能力 DMIPS: Dhrystone Million Inst ...

  9. luogu1336 最佳课题选择

    背包问题加强版orz #include<iostream> #include<cstdio> #include<cmath> #include<cstring ...

  10. bzoj 2510: 弱题 概率期望dp+循环矩阵

    题目: Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M) ...