Java对象空间分配流程
对象空间分配流程如下:
针对这个流程,分别解释一下每一个选项的使用场景。
栈上分配:
栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。
- 全局逃逸:一个对象的引用逃出了方法或者线程。
- 参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。
- 没有逃逸:一个可以进行标量替换的对象。
基于分析结果,一般有如下3种优化:
- 堆分配对象变成栈分配对象,栈分配的对象,不需要gc,在方法离开此方法栈后,栈空间的数据随之销毁。
- 消除同步,逃逸分析可以判断出某个对象是否始终只被一个线程访问,如果只被一个线程访问,那可以取消对其的同步保护,可以较大的提升并发程度与性能。
- 矢量替代,如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内。
逃逸分析:
开启:-XX:+DoEscapeAnalysis
关闭:-XX:-DoEscapeAnalysis
标量替换:
开启:-XX:+EliminateAllocations
关闭:-XX:-EliminateAllocations
锁消除:
开启:-XX:+EliminateLocks
关闭:-XX:-EliminateLocks
在jdk1.8都是默认开启的。
栈空间的大小,对栈上分配有一定的影响,但栈空间更多的是影响线程调用栈深度与可以创建的线程数量。
TLAB分配:
一般的对象分配内存,都是在新生代进行空间申请的。在多个线程都在申请空间时,每次对象分配都必须进行同步。竞争激烈的场合分配的效率又会进一步下降。TLAB是一个存在于eden区的线程独享内存区域,主要用于降低在新生代分配对象时的内存竞争,提升对象分配的效率。
默认开启,也可以使用-XX:+UseTLA参数主动开启。
TLAB的refill操作包括如下几个动作:
- 将当前TLAB抛弃,这个过程中最重要的是将TLAB末尾尚未分配给Java对象的空间分配成一个filler object;
- 从Eden区新分配一块空白的空间(可能存在失败);
- 将新分配的空间范围记录到ThreadLocalAllocBuffer里。
TLAB refill不成功,就会触发YGC。
Java对象空间分配流程相关推荐
- 【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )
文章目录 I . 设置 Java 对象 属性 流程 II . 查找 Java 对象属性 ( GetFieldID ) III . 设置 Java 对象属性 ( SetXxxField ) I . 设置 ...
- 深入理解JVM之对象分配流程
Java对象分配流程 栈上分配 参考: https://www.cnblogs.com/BlueStarWei/p/9358757.html (讲的很好) https://blog.csdn.net/ ...
- Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?
苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...
- java对象的内存分配流程
了解对象的内存分配流程对常见内存溢出问题.jvm优化有很大作用. 内存分配原则 对象栈内分配 通常理解new对象都在堆中分配存储空间,但是当(通过逃逸分析 确定)对象仅在方法内使用而未被外部访问的时候 ...
- 【JVM】Java对象创建的流程步骤
· 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...
- 韩顺平Java学习笔记P245对象创建流程分析P246this关键字-P250
P245对象创建流程分析 //1.先在方法区加载方法类 //2.在堆里开空间一个存放age,一个存放name //3.(先默认初始化有默认值age=0,name=null,再显示初始化age=90,n ...
- Java对象分配原理
Java对象模型: OOP-Klass模型 在正式探讨JVM对象的创建前,先简单地介绍一下hotspot中实现的Java的对象模型.在JVM中,并没有直接将Java对象映射成C++对象,而是采用了oo ...
- sqlserver2008未将对象引用设置到对象的实例_JVM | Java对象的创建、存储和访问详解...
引言 Java程序员都知道如何创建对象,不就是一个Person person = new Person()的语句就解决了么?然而,我们只知道new,却对于底层如何实现对象的创建.如何存储到内存中去 ...
- 谈谈Java对象的生命周期
经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段. 1 对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令 ...
最新文章
- 4种事务特性,5种隔离级别,7种传播行为
- 你研究过单例么?这样写单例效率最高.
- Discuz!NT博客非官方升级!!
- Docker最全教程——从理论到实战(七)
- 10年老电脑如何提速_中国电信宣布将对宽带免费提速,最高500Mbps
- kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门
- 黄子韬现身助力公益 百度推出听障儿童手语翻译小程序
- 2021 年各家大厂的 AI Lab 现状如何?
- 进制转换演示及其Python示例
- python jupyter
- ubuntu16.04 pytorch 安装
- 修改docx表格_文件杂乱怎么办?批量整理修改文件名我就用它
- element tree不刷新视图_安卓从入门到进阶第五章(视图查看)
- mysql gui tools ojdbc14.jar_转 OJDBC驱动版本区别 [ojdbc14.jar,ojdbc5.jar跟ojdbc6.jar的区别]...
- SpringDataJPA调用存储过程实例
- PMP-强化练习题一(180题答案及解析)
- php两段音频合成一个,使用PHP合并MP3文件的类,兼容php4、php5
- 【qstock量化】数据篇之宏观指标和财经新闻文本
- VS2015官方下载地址(个人免费版)
- js 页面打印,兼容单个打印和分页批量打印,自定义页眉和简单页脚