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

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

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

时间: 2024-11-02 07:57:44

JVM对象分配和GC分布【JVM】的相关文章

JVM 对象分配

JVM参数: 1)-Xmn: 新生代内存上限值 2)-Xms: 整个堆区初始内存分配的大小 3)-Xmx: 堆区内存的最大分配大小 4)-XX:SurvivorRatio: 决定eden与一个survivor大小之比 5)-XX:PretenureSizeThreshold: 大对象直接放入老年代,避免在Eden区和两个survivor区进行大量内存复制 6)-XX:MaxTenuringThreshold: 对象进入老年代的岁数,默认为15 担保机制: 当对象无法放入survivor空间,对象

JVM对象分配内存的工作流程图

备注: 1.超大对象是指对象大小大于Eden+S0 2.新生代采用复制算法进行垃圾回收 3.老年代采用标记整理算法进行垃圾回收 原文地址:https://www.cnblogs.com/gaopengpy/p/12180381.html

JVM虚拟机垃圾回收(GC)算法及优缺点

一.什么是GC GC是jvm的垃圾回收,垃圾回收的规律和原则为: 次数上频繁收集新生区(Young) 次数上较少收集养老区(Old) 基本上不动永久区(Perm) 二.GC算法(分代收集算法) GC总共有四大算法,分别是: ①引用计数法 ②复制算法(Copying) ③标记清除(Mark-Sweep) ④标记压缩(Mark-Compact) ⑤标记清除压缩(Mark-Sweep-Compact) 1.1 引用计数法 1.2 复制算法(Copying) 复制算法主要用在新生代中. 1.2.1 复制

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存

JVM GC 之二对象分配

Java体系中的内存自动管理其实是解决两大问题:给对象分配内存和回收分配个对象的内存. 一般情况下对象是在堆上分配(但也可能是经过JIT(Java即时编译)编译后被拆散为标量类型并间接的在栈上分配),对象主要是分配在新生代中的Eden区,如果启动了本地线程分配缓冲,将按线程优先分TLAB上.也可以通过配置 -XX:PretenureSizeThreshold参数直接分配在老年代中. 英文诗意:Max  Tenuring占有 Threshole阀值      对象有限分配在Eden区      多

认识JVM(1)——对象分配&回收算法

本来标题党想写成<深入JVM>,不过不太敢写,我想一小篇博客我想还不足以说明JVM,在本文中,会就我所知给大家介绍JVM的很多内部知识,概念会相对较粗,因为太细的内容要写,这里肯定写不出来:本文主要偏重理论,没有什么实践,中间除一些官方资料外,还有部分自身的理解,所以请大家不要完全信任本文内容:另外本文会有一小部分纠正以前一篇文章对于intern()使用方法的错误,本文会在其中说明使用错误的原因,大致文章内容有以下几个部分: 1.JVM虚拟内存组成及操作系统地址表 2.新生成对象在HeapSi

JVM之垃圾收集器 (GC) 与内存分配策略

1.为什么要学习GC? GC (Garbage Collection)早于java出现,60年代出现的Lisp中最早使用了GC. 当需要排查各种内存溢出.内存漏斗问题时,当垃圾回收成为系统达到更高并发量的瓶颈时,就需要用到gc了. 总之,写出高性能的Java程序需要懂GC. 2.GC在JVM的体系结构中的位置 HotSpot JVM体系结构. 和应用性能相关的部分用紫色标出,调优从它们着手! 3.什么是性能? 在对Java应用程序进行调优时,主要关注两点:响应速度和吞吐量. 3.1响应速度 响应

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. 怎样分配- JVM内存分配策略 对象内存主要分配在新生代Eden区, 如果启用了本地线程分配缓冲, 则优先在TLAB上分配, 少数情况能会直接分配在老年代, 或被拆分成标量类型在栈上分配(JIT优化). 分配的规则并不是百分百固定, 细节主要取

jvm对大对象分配内存的特殊处理(转)

前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下: Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 紧接着,开始写程序.很简单,就是初