码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-28 18:31:55      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:不能   局部变量   基础   私有   garbage   访问   参数   vivo   生活   

最近在学习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)。

	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垃圾堆积的
		 情况了

当对象达到老年代的时候

		当一个对象到了老年代的时候,其他对象到达老年代也无法放下时,jvm会执行FGC(Full Garbage Collection)操作,这个时候,垃圾收集器就进行全GC操作,如果FGC收集过后
		对象仍然无法存放到内存区,这个时候JVM会告知你  内存不足  会抛出OOM(Out Of Memory)

JVM调优

		当出现了OOM,快速定位,在JVM内设置运行参数,-Xx:+HeapDumpOnOutOfMemoryError,这个时候出现了OOM,系统会打印出堆内的信息
		
		如果系统出现了OOM的时候,你会怎么办呢?

原文:https://choviwu.top/archives/jvmHeap

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

标签:不能   局部变量   基础   私有   garbage   访问   参数   vivo   生活   

原文地址:https://www.cnblogs.com/ChoviWu/p/10192007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!