通常来说关于jvm对于对象的内存分配,只要到堆内分配一般就over了,但是在很多人的博客或者帖子中又说了一些其他的分配,比如栈内分配等等,搞的自己有点眼晕,索性就将jvm内存分配的方式统统查了一遍,然后总体上给缕一下。一来是方便自己,权当读书笔记,二来希望有人能一起讨论下。
jvm在内存区域中专门划分出一块区域来,用于存储对象的相关数据,这块区域就叫做堆。堆内的对象数据是各个线程所共享的,所以当再堆内创建新的对象时,就要进行锁操作。而众所周知锁操作是比较耗费性能的,因此针对每个线程,jvm给它在堆上分配了一块“自留地”——TLAB。TLAB全称是Thread Local Allocation Buffer,处于堆内存的年轻区,也就是Eden这个区域里。每个线程在创建新的对象时,会首先尝试在自己的TLAB里进行分配,如果成功就返回,失败了再到共享的Eden区里去申请空间。在自己的TLAB区域创建对象失败一般有两个原因:一个是对象太大,第二个是自己的TLAB区剩余空间不够。
这里就涉及到TLAB区域大小的问题了。通常默认的TLAB区域大小是Eden区域的1%,当然也可以手工进行调整,对应的JVM参数是-XX:TLABWasteTargetPercent。
jvm在进行了上面的优化之后,发现创建对象还有可以优化的空间。空间在哪里?在于对象的生存周期。大部分所创建的对象都无法逃脱一次GC的,其中很多对象更是在一个线程、乃至一个方法调用结束后就over了。针对那些只在一次方法调用内生存的对象,jvm通过server方式的优化对其分配策略进行了改进。首先server方式的优化是可以进行复杂的逃逸分析,而后jvm根据逃逸分析的结果,将未逃逸的对象,直接在栈内分配内存空间。什么?栈内??没错!!这个分配方式就是栈内分配,当线程结束时,栈空间被收回,对象也就直接被回收了。由于栈的操作非常快,所以这种对于对象的操作也更加快速。那么栈内分配时对象数据放在哪里?这块我还没看到相关资料,我分析栈帧有三个区域,局部变量区、操作数区和剩余区域,所以对象数据应该是放在剩余的区域里,当然这块是猜测。
以上就是两种额外的jvm内存分配方式。总结起来就是:在server端优化下,如果对象未逃逸,则直接在栈内分配;逃逸之后先尝试在TLAB中分配,失败后再在堆内分配,还失败的话,那么就GC吧。
分享到:
相关推荐
Jvm对象内存分配理解
1.1 对象优先在Eden区分配 1.2 大对象直接进入老年代 1.3 长期存活的对象将进入老年代
主要介绍了JVM对象创建和内存分配原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放...
- 内存分配方式有哪些呢? - 请你说一下对象的内存布局? - 对象头 Header - 实例数据 Instance Data - 对齐 Padding - 对象访问定位的方式有哪些? - 如何判断对象已经死亡? - 如何判断一个不再使用的类?...
在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解...
包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码 第1讲 说在前面的话 免费 00:05:07 第2讲 整个部分要讲的内容说明 免费 00:06:58 第3讲...
JVM 面试题总结 JVM 的主要作用是什么? 请你描述一下 Java 的内存区域?...内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象访问定位的方式有哪些? 如何判断对象已经死亡? 如何判断一个不再使用的类?
内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象头 Header 实例数据 Instance Data 对齐 Padding 对象访问定位的方式有哪些? 如何判断对象已经死亡? 如何判断一个不再使用的类? JVM 分代收集理论有哪些...
JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。
对象分配内存空间过程; 对象的浅克隆和深克隆; 类加载 类加载过程(类加载从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来) 类加载特性 ; 类加载的时机: 三种类加载器: 双亲委派机制概念; ...
描述对象的创建过程,对象的内存布局,jvm指针压缩,对象访问
Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...
内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...
JVM调优是一个系统而又复杂的过程,由于Java虚拟机自动管理内存,在大多数情况下,我们基本上不用去调整JVM内存分配,因为一些初始化参数已经可以保证应用服务正常稳定地工作。但是当有性能问题的时候该怎么去调优,...
第46节内存分配-长期存活的对象进入老年代00:03:40分钟 | 第47节内存分配-空间分配担保00:04:54分钟 | 第48节内存分配-逃逸分析与栈上分配00:10:32分钟 | 第49节虚拟机工具介绍00:10:27分钟 | 第50节虚拟机工具-...
主要包括:java内存结构、堆内存的构成、堆内存参数调整、垃圾收集算法、垃圾收集器选择、JVM参数、java对象的内存分配过程、Tomcat调优并使用Jmeter评测、参考资料等。希望对大家学习jvm有帮助。
对象的创建流程与内存分配; 对象内存布局;如何访问一个对象;GC基本原理;串行收集器;并行收集器; 能学到什么:1,JVM底层运行机制和原理;2JVM参数;3,垃圾回收原理;4,垃圾回收器的使用;5,调优实战案例 ...