JVM-017-运行时数据区-堆(Heap)-对象分配的过程
概述
为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。
JVM-017-运行时数据区-堆(Heap)-对象分配的过程
为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。
JVM-016-运行时数据区-堆(Heap)-年轻代和老年代
年轻代(YoungGen)
和老年代(OldGen)
Eden(伊甸园)空间
与Survivor0(幸存者0)空间
、Survivor1(幸存者1)空间
(有时也叫做 from区
、to区
)JVM-015-运行时数据区-堆(Heap)-设置堆内存大小和OOM
Java 堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,可以通过选项”-Xms
“和”-Xmx
“来进行设置。
-Xms
用于表示堆区的起始内存,等价于-XX:InitialHeapSize
-Xmx
则用于表示堆区的最大内存,等价于-XX:MaxHeapSize
举例栈溢出的情况?(StackOverFlowError)
-Xss
设置栈的大小后,当超出这个次数,就会报 SOF(StackOverFlowError)JVM-009-运行时数据区-虚拟机栈-方法返回地址(Return Address)
JVM-008-运行时数据区-虚拟机栈-动态链接(Dynamic Linking)
动态链接(Dynamic Linking)
,比如:invokedynamic 指令JVM-007-运行时数据区-虚拟机栈-操作数栈(Operand Stack)
栈的含义:先进后出,可以使用数组或链表来实现,但不具有数组或链表的特性(任意位置增删改等)
而操作数栈的含义:只是使用了数组来存储实现的栈,即按照顺序存放,有索引,但是并非采用访问索引的方式来进行数据访问的,只能通过入栈和出栈来操作数据
每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)
的操作数栈
,也可以称为 表达式栈(Expression Stack)