对象空间分配流程如下:
 
针对这个流程,分别解释一下每一个选项的使用场景。

栈上分配:

栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。
  • 全局逃逸:一个对象的引用逃出了方法或者线程。
  • 参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。
  • 没有逃逸:一个可以进行标量替换的对象。
基于分析结果,一般有如下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对象空间分配流程的更多相关文章

  1. Java对象回收流程

    一.可回收对象判断 引用计数器算法:为对象放置一个引用计数器,当对象被引用时则计数器加一,如果一个对象的计数器标识为零的时候,则表明该对象可被回收.这种方法比较简单,但无法解决对象之间互相引用的情况. ...

  2. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  3. Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...

  4. java 对象的初始化流程(静态成员、静态代码块、普通代码块、构造方法)

    一.java对象初始化过程 第一步,加载该类,一个java对象在初始化前会进行类加载,在JVM中生成Class对象.加载一个类会进行如下操作,下面给出递归描述.(关于Class对象详见反射 点击这里) ...

  5. java对象与XML相互转化

    起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...

  6. Activiti工作流学习(一)部署对象和流程定义

    一.前言 前一段时间在工作中,使用了流程审批,对api的调用非常不熟悉,都是调用别人写好的接口在界面上进行显示,基本了解了流程审批的主要步骤,现对流程审批进行学习,主要是调用api进行CRUD操作,感 ...

  7. Java对象在JVM中的生命周期

          当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...

  8. Java对象的创建

    学了很久的java,是时候来一波深入思考了.比如:对象是如何在JVM中创建,并且被使用的.本文主要讲解下new对象的创建过程.要想更深入的了解建议去认认真真的看几遍<深入理解Java虚拟机> ...

  9. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

随机推荐

  1. 【win7下安装node.js错误:roling back action】与【"grunt" 不是内部或外部命令】 解决方法

    [win7下安装node.js错误:roling back action] 解决方法: Node.js 服务器端的JavaScript Node.js 是一个基于Chrome JavaScript 运 ...

  2. 20155209实验二《Java面向对象程序设计》

    20155209实验二<Java面向对象程序设计> 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计 ...

  3. 20155305乔磊2016-2017-2《Java程序设计》第二周学习总结

    20155305乔磊 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 第三章学习了基本类型 整数(short.int.long) 字节(byte) 浮点数(f ...

  4. 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验一

    20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验一 此次实验我和黄月同学一起做了1.2.3.5项,第4项在实验课上做完了,但是没有按时提交. ...

  5. 20155315 2016-2017-2 《Java程序设计》第一周学习总结

    教材学习内容总结 第一章中提到了Java的前世今生和三大平台,我了解到Java SE包括JVM,JRE,JDK和Java语言.java最基本的特性之一是"跨平台",这使得Java语 ...

  6. 课上实践练习——MyOd

    编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 Linux下od -tx -tc XXX的功能 1.功能 od命令用于将指定文件内容以八进制.十 ...

  7. [BZOJ2961]共点圆-[凸包+cdq分治]

    Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...

  8. Zabbix学习之路(六)TCP状态监控

    TCP状态监控 Tcp的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了***,或是是time_wait值比 ...

  9. 17、JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  10. (转) PHP 开发者该知道的 5 个 Composer 小技巧

    1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单: composer update foo/bar 此外,这个技巧还可以用来解决“警告信息问题”.你一定见过这样的警告信息: Wa ...