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堆”;

人们常说记忆

相关资讯:
我不知道哪个APP更好?没关系。让我们来看看这个评估

我不知道哪个APP更好?没关系。让我们来看看这个评估

查看
Topco APP排行榜!

Topco APP排行榜!

查看
哪些拓客APP更可靠

哪些拓客APP更可靠

查看
有哪些方法可以有效提高APP产品的下载率?

有哪些方法可以有效提高APP产品的下载率?

查看
iOSApp扫描和检测3D对象的终极指南

iOSApp扫描和检测3D对象的终极指南

查看