1. 运行时内存
如图所示, Java内存结构可以区分为:堆、方法区、虚拟机栈、本地方法栈、程序计数器。
-
堆(Heap)
- 线程共享的一块内存区域, 主要作用是用来存放对象实例和数组。
- 占用内存空间最大,是Java垃圾回收重点关注的区域。
- 物理上不连续,由一片片空间拼凑而成, 只要逻辑上连续就可以。
- 没有内存进行对象实例创建并无法再扩展时, 会抛出OutOfMemoryError异常。
- -Xmx -Xms 指定最大、最小堆
-
方法区(Method Area)
- 线程共享、 内存不连续、可扩展、可垃圾回收。
- 存储类信息、常量、静态变量、即时编译器编译后的代码等数据。
-
虚拟机栈(VM Stack)
- 线程私有,生命期同线程。
- 虚拟机栈描述Java的内存模型,每个方法执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等,每一个方法从调用直至执行完成,对应着一个栈桢在虚拟机栈中的从入栈到出栈。
3.局部变量表用于存储方法参数和方法定义的局部变量,包含8种基本类型和引用类型等。 - 错误类型:StackOverflowError 和 OutOfMemoryError
-
本地方法栈
- 本地方法栈和虚拟机栈类似,本地方法栈用于执行Java调用的本地方法。
-
程序计数器
- 线程私有,内存小, 没有OOM错误
- 是当前线程所执行的字节码的行号指示器
网友评论