Android |用于App内存优化的JVM&Android内存管理机制和GC机制(扩展.GCRoot)
浏览:703 次

Java内存分配
图Zimuke.com
在java语言中,可以用作GCRoot的对象包括:
虚拟机堆栈中引用的对象主要是指堆栈框架中的局部变量
本地方法堆栈中Native方法引用的对象
方法区域中类静态属性引用的对象
方法区域中常量引用的对象
方法区域:
它也称为静态区域。和Java堆一样,它是所有线程共享的内存区域。!!!!
方法区域包含所有类文件和静态变量/方法!!!
方法区域包含在整个程序中始终唯一的元素,例如类和静态变量。
用于存储
由虚拟机加载
类信息、常量、静态变量、由即时编译器编译的代码/Java类文件和其他数据。
人们更喜欢称这一地区为“永久一代”,
在JDK1.7发布的HotSpot中,最初放置在永久生成中的字符串常量池已被移出。
它还有一个别名叫Non Heap。
除了与Java堆相同之外,
无连续存储器和
您可以选择固定大小或可扩展,
您也可以选择不实现GC。
在Java虚拟机规范中,
当方法区域无法满足内存分配要求时,将引发OutOfMemoryError异常。
堆栈
每个线程包含一个堆栈区域,
堆栈中仅保存基本数据类型的对象引用及其相应值和基本数据引用

(Java语言提供了八种基本数据类型:
六种数字类型(四个整数长、整数、短、字节、两个浮点浮点、双精度),
一种字符类型是String,另一种是Boolean)
每个堆栈中的数据(基本数据类型和对象引用)是私有的,
无法访问其他堆栈。
堆栈分为三部分:
基本类型变量区域、执行环境上下文和操作指令区域(存储操作指令的区域)。
虚拟机栈
每个方法在执行时创建堆栈帧,
用于存储局部变量表、操作数堆栈、动态链接、方法出口和其他信息。
每个方法从调用到执行完成的过程,
它对应于堆栈帧从被推入虚拟机堆栈到被推出堆栈的过程。
局部变量表存储
各种基本数据类型、对象引用类型和returnAddress类型,
它所需的内存空间在编译期间分配。
它是线程私有内存,与线程生命周期相同。!!!!
Java存储器通常分为堆存储器(heap)和堆栈存储器(stack),
“堆栈”指虚拟机堆栈,“堆”指Java堆。
在Java虚拟机规范中,为该区域指定了两个例外:
如果线程请求的堆栈深度大于虚拟机的允许深度,
将引发StackOverflowError异常;
如果虚拟机堆栈可以动态扩展并且在扩展期间不能请求足够的内存,
将引发OutOfMemoryError异常。
本机方法堆栈
存储局部变量表、操作数堆栈等;
它是虚拟机使用的本机方法服务。

在虚拟机规范中,这一领域没有强制规定,由特定的虚拟机自由实现。
与虚拟机堆栈类似,
StackOverflowError和OutOfMemoryError异常也将在本地方法堆栈区域中抛出。
虚拟机堆栈服务于Java方法;
本地方法堆栈为本机方法服务;
当然,要注意String的特殊性
一个例子:
另一个例子:
堆
存储所有对象,
每个对象都包含相应的类信息。
(上课的目的是获得操作说明)
jvm只有一个由所有线程共享的堆。堆不存储基本类型和对象引用,只存储对象本身
虚拟机启动时创建的由所有线程共享的内存区域;
包括所有新对象;
每个对象的实际分配内存在堆上分配;
用于存储几乎所有对象实例和数组。
在Java堆中,
可以划分多个线程专用的线程本地分配缓冲器(TLAB),
然而,无论哪个区域、对象实例仍然被存储,
进一步划分的目的是
为了更好地回收存储器,
或者更快地分配内存。
在虚拟机堆栈中仅分配引用,
虚拟机堆栈中的引用将指向堆中实际创建的对象;
它是GC的主要功能和管理领域。因为它占用了最大的内存,所以最有可能产生垃圾。它也称为“GC堆”;

人们常说记忆