前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM对象分配和GC分布【JVM】

JVM对象分配和GC分布【JVM】

作者头像
简单的程序员
发布2020-04-20 12:03:20
4880
发布2020-04-20 12:03:20
举报
文章被收录于专栏:奕仁专栏奕仁专栏

最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象:

栈:什么是栈? 先说一下栈的数据结构吧,栈它是一种先进后出的数据结构(FILO),跟队列刚好相反(先进先出FIFO),生活中有哪些例子, 举个例子 给子弹上膛,上弹的操作就类似于栈的数据结构,先压入的子弹后发射,因为它被压入到了最底部(栈底),所以,它会先发射最上面的子弹(栈顶), 说了这个概念,想必应该已经熟悉了栈的数据结构了吧。 再说一下栈,栈相当于一个桶,里面有方法区,局部变量表,方法返回地址,操作栈(加减乘除) 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 每个方法内部的操作都是在栈内进行操作的(操作栈)

堆: 什么是堆?堆是分布在java虚拟机上的一块内存,所以,它是物理存在的, 堆里面存储的是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,可以这样说,堆区的内容是线程共享区

本篇内容主要写的是对象的分配,所以,理论上只跟“堆”有关系, 结合上面的思维导图,说一下,当用户new Object的时候,jvm会把这个对象放入堆里面,并把对象的引用存入栈里面,创建对象之后,自然下一步就是为对象分配内存咯, 堆内存分为“新生代”(eden)和老年代(old),新new出来的对象会被存放在eden区,当eden区域放不下的时候,设计jvm的工程师会想,eden区的对象这么多都不用了, 能不能把不用的对象给它回收掉呢? 接下来就很牵强得扯到了 jvm的eden区的回收(Young Garbage Collection 下面简称 YGC)。

代码语言:javascript
复制
YGC的目的是处理回收eden区没有被引用的对象,处理一次YGC会给这个对象回收次数+1(这是为什么呢? 因为jvm考虑到有些eden区创建的大对象YGC并不能回收掉
		这个时候YGC会将它放入Survivor区域)
新生代 = 1个eden区 + 2个survivor 区

survivor是什么? 上面说道了YGC将对象回收不了的放入Survivor区,survivor区存放的是eden区无法回收的对象,它对应的也是一块内存区域,但是这个区域很小,同时这个区域 又分为 s0、 s1 两块连续的内存块 ,如果说,S区域存满的时候,此时,那部分回收不了对象放置哪里呢?

答案是放入老年代,当一个对象新生代已经容不下你的时候,那么你就乖乖得变“老”吧!

当然,如果说S区的对象存活达到一定得阈值,JVM会计算这个对象的当前回收次数,如果大于某个值,默认15,直接将这个对象放入老年代,这样也就避免了jvm垃圾堆积的情况了

当对象达到老年代的时候
代码语言:javascript
复制
当一个对象到了老年代的时候,其他对象到达老年代也无法放下时,jvm会执行FGC(Full Garbage Collection)操作,这个时候,垃圾收集器就进行全GC操作,如果FGC收集过后对象仍然无法存放到内存区,这个时候JVM会告知你  内存不足  会抛出OOM(Out Of Memory)
JVM调优
代码语言:javascript
复制
	当出现了OOM,快速定位,在JVM内设置运行参数,-Xx:+HeapDumpOnOutOfMemoryError,这个时候出现了OOM,系统会打印出堆内的信息,如果系统出现了OOM的时候,你会怎么办呢?
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新生代 = 1个eden区 + 2个survivor 区
  • 当对象达到老年代的时候
  • JVM调优
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档