理解JVM之内存分配以及分代思想实现
1.基本内存分批策略
大多数情况在新生代Eden区分配,如果启动了本地线程分配缓冲,将按线程优先在TLAB(线程私有缓冲区)上分配.当Eden区域没有足够的空间时将发起一次Minor GC.
值得注意的是,如果一个对象过大(例如分配了一个大的byte[]数组),该对象将直接进入老年代..因为对象过大会让新生区采用垃圾回收算法-----复制算法的效率大大降低,如果该对象存活,其会让Eden区跟两个survivor区之间发生大量的内存复制,且容易触发内存担保机制.更要命的是一个短命的对象,为了分配这个大对象花了大量的时间为他腾出空间,结果过一会就没用了,这个应该在编程时注意.
2.分代思想
为了实现分代算法,虚拟机给每个对象定义了一个对象年龄计数器,如果该对象在Eden出生并且经过一次minor GC后仍然存活,且能被Survivor容纳,将被移动到Survivor空间中并且年龄加一,当他的年龄增加到一定程度(默认15),就会进入老年代.
为了能够更好的适应不同程序的内存状况,虚拟机并不是永远的要求对象的年龄必须达到了年龄阈值才能进入老年代.如果Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就直接进入老年代.
3.空间分配担保
在发生minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么本次GC是安全的.如果不成立,那么会继续检查老年代最大连续可用空间是否大于历次晋升到老年代对象的平均大小(这个平均大小实际是一种动态概率的说短),会进行一次冒险的minor GC.可设置不允许这种冒险.
ps:
新生代GC(minor GC):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的贴点,所以minor GC非常频繁,一般回收速度也非常快.
老年代GC(Major GC/Ful GC):指发生在老年代的GC,出现了major GC,经常会伴随至少一次的minor GC(但不是绝对).Major GC速度一般比Minor GC慢10倍以上.
理解JVM之内存分配以及分代思想实现的更多相关文章
- JVM初探- 内存分配、GC原理与垃圾收集器
JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...
- JVM的内存分配垃圾回收策略
之前看过<深入了解Java虚拟机>感觉容易忘,今天写一篇博客加深一下印象. JVM的内存分配和垃圾回收(GC)主要发生在Java堆中.而Java堆根据对象的存活时间可以分为新生代和老年代, ...
- 一夜搞懂 | JVM GC&内存分配
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习GC&内存分配? 时代发展到现在,如今的内存动态分配与内存回收技术已经相当成 ...
- JVM总结(二):JVM的内存分配策略
这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...
- JVM的内存分配与垃圾回收策略
自动内存管理机制主要解决了两个问题:给对象分配内存以及回收分配给对象的内存. >>垃圾回收的区域 前面的笔记中整理过虚拟机运行数据区,再看一下这个区域: 注意在这个Runtime Data ...
- 深入理解 JVM 的内存区域
深入理解运行时数据区 代码示例: 1. JVM 向操作系统申请内存: JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终 ...
- jvm之内存分配与回收策略
1.java堆中各代分布 (1)Young:主要是用来存放新生的对象. (2)Old:主要存放应用程序中生命周期长的内存对象. (3)Permanent:是指内存的永久保存区域,主要存放Class和M ...
- JVM的分代思想
Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 永久代是HotSpot虚拟机特有的概念,它采用永久 ...
- 深入理解JVM - Java内存区域与内存溢出异常 - 第二章
一 运行时数据区域 JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间. 程序计数器 程序计数器(Program Counter ...
随机推荐
- 123457123456#0#-----com.threeapp.renZheDadishu02-----忍者版打地鼠
com.threeapp.renZheDadishu02-----忍者版打地鼠
- (三)Centos之安装Xshell
Xshell就是一个远程控制Centos的软件:(用XShell比较方便,试用的都知道,界面也人性化) 详细介绍请看 百度百科 我随便百度下载了一个中文版的 给下地址 http://pan.baid ...
- laravel输出HTML内容
blade模板引擎中的{{ $xxx }}表达式的返回值将被自动传递给 PHP 的 htmlentities 函数进行处理,以防止 XSS 攻击. 如果需要展示未转义的数据,可以使用{!! $xxx ...
- js 高级程序设计 第四章学习笔记
问题:怎么才能形象的理解堆栈空间? 1. 声明变量 使用 var 声明的变量会自动被添加到最接近的环境中.在函数内部,最接近的环境就是函数的局部 环境:在 with 语句中,最接近的环境是函数环境.如 ...
- 二十四 java 多线程一些知识点
1:blocked线程和waiting的线程的区别? 如何唤醒? java线程中含有waiting与blocked两种状态: 线程的 blocked状态往往是无法进入同步方法/代码块来完成的(BLOC ...
- Python视频教程免费分享(2020年最新版)
为期92天的全套Python视频教程免费分享,总计57G! 里面还有我的笔记,希望对大家有帮助哈~ 1-32天 … … 65-92天 百度云网盘: 链接: https://pan.baidu.com/ ...
- C++Primer 5th Chap7 Classes
this关键字: 在成员函数内部可以直接调用函数的对象的成员(类成员的直接访问看做是对this隐式引用,默认this指向非常量) 例如:string isbn() const{return this- ...
- git使用中的一些命令及心得
Git 与 SVN 区别点: 1.Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心 的区别. 2.Git 把内容按元数据方式存储,而 SV ...
- python学习-24 局部变量与全局变量
局部变量与全局变量 1.没有缩进的变量,为全局变量 name = 'jphn' 在子程序里定义的变量,局部变量 2. name = 'jphn' #全局变量 def a(): name='andy' ...
- go map的定义和使用 键值对存储
定义map var m map[string]int //定义map 初始化map m = make(map[string]int) //初始化map 修改map中ok 的值 m[&qu ...