3.JAVA内存区域分布图
2021-07-22 18:12:30 0 举报
JVM内存分布
作者其他创作
大纲/内容
StatckOverFlowError
4.类变量(类的静态变量)
2.域信息(Field) 类型的所有域的相关信息及域的声明顺序域的相关信息包括: 域名 域类型 修饰符
加载到内存后产生
线程私有
由于直接内存受到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。
1.类型信息 对每个加载的类型,jvm必须在方法区中存储以下类型信息:A. 完整有效名 B.直接父类的完整有效名(interface或是Object类除外-没有父类)span style=\"font-size: inherit;\
否(本地方法)
类加载器在类加载时提取出来因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程等待。
3.方法信息 (Method)类型的所有方法的相关信息及声明顺序方法相关信息包括:方法名 返回类型 参数的数量和类型(有序的) 修饰符 异常表
OutOfMemoryError:Java heap space
undefined
OutOfMemoryError
返回地址: 见附录
方法区(Method Area):
附录1:方法退出的方式分两种:正常完成出口和异常完成出口正常完成出口:执行引擎执行任意一个方法返回(如:return)的字节码指令,这时候会可能会有返回值返回值方法的调用者。一般来说,正常退出时,调用者的PC计数器的值可以作为放回地址。异常完成出口:在方法执行的过程中遇到了异常,且没有在方法体中进行处理。异常完成出口退出时,不会给上层调用者任何返回值。方法退出实际上等同于当前栈帧出栈,因此一般过程为:1.恢复上层方法的局部变量表和操作数栈。2.把返回值压入调用者栈帧的操作数栈中3.调整PC计数器的值以指向后面一条指令。附录2: 逃逸分析: 逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义后,可能会被外部方法所引用,比如方法调用,也有可能被其他线程访问,比如类变量,这两种情况分别叫做对象的方法逃逸和线程逃逸 如果虚拟机通过分析得出对象不会存在方法逃逸或者线程逃逸,则可以进而采取下面几种优化措施: 同步消除:同步操作是一个耗时的过程,如果确定一个变量不会发生线程逃逸,也就是不会被其他线程访问到,那对于这个变量的同步操作就会被去除 栈上分配:对象在堆中分配,在堆中被标记回收这是大家熟知的,而回收和整理内存都需要消耗CPU,如果确定一个对象不会发生方法逃逸,考虑直接在栈帧中为该对象分配空间而不是在堆中会是一个很好地主意,由于绝大部分对象都不会逃逸,这样在方法退出时对象内存即可被回收,垃圾收集系统的压力会小很多 标量替换:标量是指一个数据已经不能用更小的数据来表示了,java中的基本类型以及String都属于标量,与此对应的可以被分解的就叫做聚合量,java中对象就是典型的聚合量,如果确定对象不会逃逸,并且对象可以被分解,那么使用时可能不会创建对象,而是只在栈中创建对象中被使用到的标量 栈上分配和标量替换这两种技术让对象在堆中分配变得不再绝对,也可以大大减轻虚拟机负担,但逃逸分析技术目前依然不太成熟,有很大的优化空间,尽管如此,逃逸分析是即时编译器优化技术的一个重要方向,今后的虚拟机技术中,逃逸分析一定会支撑起一系列实用有效的优化技术
OutOfMemoryError:PermGen space
虚拟机字节码的指令位置
直接内存(Direct Memory):直接内存,就是JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来作为此区域的引用进行操作。
程序计数器存的值取决于正在执行的是不是java方法
6.运行时常量池:用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用
在内存不足时抛出OutOfMemoryError:PermGen space异常
线程共享
程序计数器内存
运行机制,异常类型等方面都与虚拟机栈相同
如果在执行垃圾回收之后,仍没有足够的内存分配,也不能再扩展,将会抛出OutOfMemoryError:Java heap space异常。
动态链接:指向运行时常量池中该栈帧所属方法的的引用
本地方法栈(Native Method Statck):本地方法栈在作用 唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。
唯一没有定义异常的区域
JAVA内存区域
是 (Java方法)
局部变量表、操作栈、动态链接、方法出口等
0 条评论
回复 删除
下一页