理解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 ...
随机推荐
- Masonry详解
- (void)viewDidLoad { [super viewDidLoad]; //1.view1 居中显示 UIView *view1 = [[UIView alloc]init]; view ...
- Azure DevOps的variable group实现array和hashtable参数的传递
Azure Devops中的variable group建议或者只能(?)添加string类型的value.基于此我们想在variable group实现array或者hashtable的传递的核心思 ...
- 汉化Git Gui
先来一个图: 其实使用自带的图形化操作git还是很方便的,但是英文界面还是让相当一部分小伙伴不太舒服,比如我哈. 汉化包地址:链接: https://pan.baidu.com/s/1qQtBUsf1 ...
- angular入门 - 环境安装及项目创建
1.安装node.js 下载,安装,在终端测试安装是否成功:node -v(查看nodejs版本) npm -v(查看npm版本) 下载地址:https://nodejs.org/en/downloa ...
- 最新 好未来java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 好未来等10家互联网公司的校招Offer,因为某些自身原因最终选择了 好未来.6.7月主要是做系统复习.项目复盘.Leet ...
- nginx 为什么受欢迎?
优势:1.高并发 2.可扩展性 3.高可靠性 4.热部署 5.BSD许可证 如何做到以上优势呢?高并发:异步io非阻塞,占用更少资源,支持更多连接可扩展:模块化设计,第三方模块多高可靠:核心框架代码的 ...
- Python学习路线图(2020年最新版)
这是我刚开始学习python时的一套学习路线,从入门到上手.(不敢说精通,哈哈~) 希望对大家有帮助哈~ 一.Python入门.环境搭建.变量.数据类型 二.Python运算符.条件结构.循环结构 三 ...
- uwp,c#,listView与gridView列表控件进阶
listView与gridView使用类似,这里讲解gridView的一些数据绑定(x:Bind)基础知识. 顺便学习下如何使用属性通知.(后台中的数据变化会直接显示在UI上,实现动态变化,默认是没有 ...
- Java程序的编写与执行、Java新手常见问题及解决方法|乐字节Java学习
今天,我们来写一段Java程序.然后看看Java程序是如何执行的,以及Java新手小白遇到的问题和解决办法. 一.HelloWorld的编写 ① 新建一个XXX.java (文件的扩展名显示出来) ...
- JSP入门基础知识详细版(通俗易懂)
JSP 第一篇: 概述.原理.周期.指令.行为.内置对象.JavaBean (一) JSP概述以及简单使用 什么是JSP? JSP全名为Java Server Pages,java服务器页面.JSP是 ...