目录
图:1.0 五大内存区域
Java虚拟机的5大内存区域:共享区的堆和方法区,独占区的虚拟机栈、本地方法栈和程序计数器
Java内存区域–线程独占区-程序计数器
-
程序计数器是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器
-
程序计数器处于线程独占区
-
如果线程执行的是java方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址. 如果正在执行的是native(C语言)方法, 这个计数器的值为undefined(空)
-
此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError(内存溢出)情况的区域
Java内存区域–线程独占区-虚拟机栈
-
虚拟机栈(先进后出)描述的是Java方法执行的动态内存模型
-
栈帧
-
每个方法执行, 都会创建一个栈帧, 伴随着方法从创建到执行完成. 用于存储局部变量表、操作数栈、动态链接、方法出口等
-
-
局部变量表
-
存放编译期可知的各种基本数据类型,引用类型(对象的应用),returnAddress类型
-
局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的(如果对象User中有String类型属性name,并不确定name的长度,为什么说方法在帧分配多少内存是固定的?因为栈中分配的是User对象的引用,对象实例的创建是在堆内存中创建的,栈中创建的只是对象的引用),在方法运行期间是不会改变局部变量表的大小
-
-
栈的大小
-
当栈的内存满了会出现StackOverflowError(栈的内存溢出异常)
-
Java内存区域–线程独占区-本地方法栈
-
虚拟机栈为虚拟机执行Java方法服务
-
本地方法栈为虚拟机执行native(C语言)方法服务
Java内存区域–线程共享区-堆内存
-
存储对象的实例
-
垃圾收集器管理的主要区域
-
新生代(垃圾回收重点活动区域)
-
Eden 新创建的对象都放在这个区域
-
Survivor 存活区,在Eden区域多次没有被回收的对象放在这个区域
-
Tenured Gen 在Survivor区域多次没有被回收的对象放在这个区域
-
-
修改堆内存的大小 -Xmx -Xms
Java内存区域–线程共享区-方法区
-
存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译期编译后的代码等数据
-
类信息包含类的版本、字段、方法、接口
-
常量池作用:字面量和符号引用。字面量比较接近Java语言层面的常量概念。而符号引用则属于编译原理的方面的概念。包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符
-
-
方法区和永久代(方法区就是永久代)
-
垃圾回收在方法区的行为
-
异常的定义
注:博文内容来自书本《深入理解Java虚拟机》第2版 周志明著
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72581.html