1、JVM-Java内存区域

导读:本篇文章讲解 1、JVM-Java内存区域,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

Java内存区域–线程独占区-程序计数器

Java内存区域–线程独占区-虚拟机栈

Java内存区域–线程独占区-本地方法栈

Java内存区域–线程共享区-堆内存

Java内存区域–线程共享区-方法区


1、JVM-Java内存区域

图:1.0 五大内存区域

 

Java虚拟机的5大内存区域:共享区的堆和方法区,独占区的虚拟机栈、本地方法栈和程序计数器


Java内存区域–线程独占区-程序计数器

  • 程序计数器是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器

  • 程序计数器处于线程独占区

  • 如果线程执行的是java方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址. 如果正在执行的是native(C语言)方法, 这个计数器的值为undefined(空)

  • 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError(内存溢出)情况的区域


Java内存区域–线程独占区-虚拟机栈

  • 虚拟机栈(先进后出)描述的是Java方法执行的动态内存模型

  • 栈帧

    • 每个方法执行, 都会创建一个栈帧, 伴随着方法从创建到执行完成. 用于存储局部变量表、操作数栈、动态链接、方法出口等1、JVM-Java内存区域

  • 局部变量表

    • 存放编译期可知的各种基本数据类型,引用类型(对象的应用),returnAddress类型

    • 局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的(如果对象User中有String类型属性name,并不确定name的长度,为什么说方法在帧分配多少内存是固定的?因为栈中分配的是User对象的引用,对象实例的创建是在堆内存中创建的,栈中创建的只是对象的引用),在方法运行期间是不会改变局部变量表的大小

  • 栈的大小

    • 当栈的内存满了会出现StackOverflowError(栈的内存溢出异常)1、JVM-Java内存区域


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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!