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
JVM对象分配和GC分布【JVM】的更多相关文章
- JVM内存分配及GC简述
在阐述JVM的内存区域之前,先来看下计算机的存储单位.从小到大依次为Bit,Byte,KB,MB,GB,TB.相邻的单位相差2的10次方. 计算机运行中的存储元件主要分为寄存器(位于CPU)和内存,寄 ...
- JVM对象分配
1.JVM中执行字节码new指令时: 1.1.分配内存 分配策略有两种方式:(1)指针碰撞 当JVM内存区域是连续的规整的,所有用过的内存都放在一边,空闲的内存都放在另外一边,中间放着 指针作为分界点 ...
- JVM内存分配及GC流程
-verbose 这是查询GC问题最常用的命令之一,具体参数如: -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断. -verbose:gc 输 ...
- JVM内存管理之GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- JVM虚拟机垃圾回收(GC)算法及优缺点
一.什么是GC GC是jvm的垃圾回收,垃圾回收的规律和原则为: 次数上频繁收集新生区(Young) 次数上较少收集养老区(Old) 基本上不动永久区(Perm) 二.GC算法(分代收 ...
- Useful JVM Flags – Part 8 (GC Logging)
The last part of this series is about garbage collection logging and associated flags. The GC log is ...
- 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控
如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...
- jvm对大对象分配内存的特殊处理(转)
前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事 ...
- JVM初探- 内存分配、GC原理与垃圾收集器
JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...
随机推荐
- (转)把hadoop源码关联到eclipse工程
把hadoop源码关联到eclipse工程 转:http://www.superwu.cn/2013/08/04/355 在eclipse中阅读源码非常方便,利于我们平时的学习,下面讲述如何把 ...
- CentOS 设置环境变量
1. 查看环境变量,echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]” echo $PATH /usr/local/bin:/usr/bin:/usr/lo ...
- [洛谷P3979]遥远的国度
题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...
- [TJOI2013]最长上升子序列 平衡树
其实是一道性质题. 首先观察到插入的数是递增的, 那么根据上升子序列的性质, 我们的非法情况就是统计到了在一个数前面的后插入的数, 但是由于插入的数是递增的,显然插入这个数后,这个数就是最大的,所以除 ...
- Vue报错
Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 8.x Found ...
- JavaScript截取中英文字符串
有时在显示某段文字的时候,可能会太长,影响我们页面的显示效果.如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了.但是通常我们都会遇到既有英文,又有汉 ...
- Emmet缩写语法
缩写语法 Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的 ...
- pexpect正确的打开方式
今天在写一个Python脚本时遇到一个问题——同样的代码,在Python终端执行没问题,在脚本里执行却不行,就是下面这段代码: import pexpect password = 'test2014' ...
- Consul 入门(二)
KV 存储 通过命令行操作 $ consul kv put hello world # 设置数据 Success! Data written to: hello $ consul kv get hel ...
- hdu 5616
Jam's balance Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...