引言:

之前的文章已经提过,java对象实例是存放在堆上的,至于是在伊甸区、存活区还是老年区,这些都是从对象回收(GC)角度来进行的逻辑划分。所以我们先说对象的回收(GC),然后再依据GC的策略来说明新的对象具体在哪个区生成。

GC(Garbage Collection):

垃圾回收,指的就是jvm占用内存的回收。那么需要回答3个问题:

  • 哪些内存需要回收?——>可达性分析算法。
  • 什么时候回收?——>简单的来说,伊甸区的空间不足发生新生代GC(Minor GC),老年代空间不足的时候发生老年代GC(Major GC / Full GC)
  • 如何回收?——>通过垃圾回收器,jdk8默认的是UseParallelGC(PS scavenge + Serial Old),还有UseConMarkSweepGC(ParNew + CMS + Serial Old),以及UseG1GC(G1)。

1、可达性分析算法:以一系列成为“GC Root”的对象最为起始点,当一个对象没有到达GC Roots的引用链条,就判定这个对象为可回收的。

GC Roots对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(即Native方法)引用的对象。

2、垃圾收集算法(分代收集):

  • 新生代,对象存活率较低,复制算法。
  • 老年代,对象存活率较高,标记-整理算法、标记-清除算法。

3、垃圾收集器:

新生代收集器:

  • Serial收集器:采用“复制”算法,暂停用户线程,单线程收集。
  • ParNew收集器:采用“复制”算法,暂停所有用户线程,采用多线程并行收集。和CMS老年代收集器搭配使用。关注点:GC时用户线程的停顿时间。
  • Parallel Scavenge收集器:采用“复制”算法,和ParNew收集器类似,但关注点不同。关注点:高吞吐量。

老年代收集器:

  • Serial Old 收集器:采用“标记-整理”算法,暂停用户线程,单线程收集。和Parallel Scavenge收集器搭配使用。
  • Parallel Old收集器:采用“标记-整理”算法,暂停用户线程,多线程并行收集。和Parallel Scavenge收集器搭配使用。
  • CMS(Concurrent Mark Sweep)收集器:采用“标记-清除”算法,不暂停用户线程,多线程并发收集。与ParNew收集器搭配使用。

新一代收集器:

G1(Garbage-First)收集器:

  • GC工作时为并行,GC与用户线程为并发;
  • 可独立管理整个GC堆,不需要与其他GC收集器配合使用;
  • 空间整合:整理上看是“标记-整理”算法实现的,从局部(两个Region之间)上看是基于“复制”算法实现的。

总结:

  1. ParallelScavenge关注的是高吞吐量;
  2. CMS关注的是低停顿时间;
  3. G1关注的是使用时间相对较短的停顿来达到很高的吞吐量,CMS的替代品,在超大堆上表现优异(eg:8g以上)。

4、GC发生时间:

(1)MinorGC:大多数情况下,对象在新生代Eden区分配。当Eden区没有足够空间时,进行一次minorGC。如果是大对象,直接在老年代分配。

(2)FullGC:

a.系统主动调用System.gc(),不一定立即执行;

b.老年代空间不足;

c.方法区空间不足;

d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存;

e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。

参考资料:《深入JAVA虚拟机》

jvm学习笔记(3)——java对象的内存分配和对象的回收(GC)相关推荐

  1. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  2. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  3. 对象创建方法,对象的内存分配,对象的访问定位

    对象创建方法: JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.连接和初始化过. 如果没有,那必须先执行相应的类的加 ...

  4. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  5. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  6. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  7. java对象的内存分配_java对象在内存的分配问题

    今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32位机器下,Integer对象的大小是i ...

  8. C++ 学习笔记之---类和动态内存分配

    参考自<C++ Primer Plus 6th Edition> 程序对内存的使用: 链接:http://zhidao.baidu.com/link?url=An7QXTHSZF7zN9r ...

  9. 【C语言进阶学习笔记】五、动态内存分配(爆肝吐血力作,强烈建议收藏!!!)

    前言 现代计算机基本都是基于冯诺伊曼结构体系设计出来的,冯诺伊曼结构体系的核心就是"存储程序",将程序(指令集)和数据以同等地位存储在内存中.但是我们的内存空间并不是无限大的,所以 ...

最新文章

  1. Linux IPC POSIX 消息队列
  2. 三次样条插值Python实现
  3. python列表修改元素_如何在Python中替换多维列表的第n个元素?
  4. re.DOTALL --编写多行模式的正则表达式
  5. html5(mp4)无法播放,HTML5的Video标签有部分MP4无法播放的问题解析(多图)
  6. springcloud工作笔记097---idea集成Mapper接口点击后自动跳转到对应的xml文件中
  7. 精确的硬盘整数分区方法
  8. java 编程思想 阅读笔记(1)
  9. 关于嵌入式Linux做底层还是应用,要掌握什么技能
  10. web前端顶岗实习总结报告_实习报告-web前端实习报告范文三篇 精品
  11. 软件测试的目的是什么?
  12. html去除背景颜色怎么设置,word文档背景颜色怎么去掉,文档背景颜色怎么去掉
  13. 2022-2027年中国精华素行业市场深度分析及投资战略规划报告
  14. Linux进阶_加密和安全
  15. 从首届微商博览会看2015年微商的趋势
  16. ISP(图像信号处理)学习笔记-DPC坏点校正
  17. OpenStack-Placement组件部署详解(T版)
  18. 单片机——点阵2(Proteus和KeilC51)
  19. html5核心ml5图片居中,HTML5图片居中的问题
  20. Java Microbenchmark Harness (JMH)

热门文章

  1. Vb.net/VB 声明API功能父窗口功能
  2. UITablView索引列表
  3. 在服务器托管中asp***的防范注意些什么?
  4. 我使用的几个Linux终端使用技巧
  5. 字符串匹配BF/RK/BM/KMP算法
  6. oracle 建分区索引_ORACLE 创建组合分区索引
  7. 解决开发问题的思路与心态
  8. golang中,new和make的区别
  9. Go入门之——GOROOT、GOPATH、GOBIN 、Project目录
  10. Whoops, looks like something went wrong.