JVM内存区域

梦里梦外; 2023-06-26 03:24 155阅读 0赞

JVM整体示意图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0F0dGVudGlvbl8w_size_16_color_FFFFFF_t_70 JVM内存区域

程序计数器:

  • 程序计数器是一块较小的内存空间,它可以看作是当前线程执行行的字节码的行号指示器(goto可以看作是按照这个行号跳转);
  • 程序计数器处于线程独占区,每一个线程都有一份;
  • 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined;
  • 此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈:

  • 虚拟机栈描述的是Java方法执行的动态内存模型
  • 栈帧

    • 每个方法执行,都会创建一个栈帧,这个栈帧伴随着方法从创建到执行完成;
    • 用于存储局部变量表,操作数栈,动态链接,方法出口等;
  • 局部变量表

    • 存放编译器可知的各种基本数据类型,引用类型,returnAddress类型;
    • 局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在栈帧中分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小的;
    • 局部变量表中存放的是一个对象的引用,所以说创建对象也不会改变它的大小(引用是一个地址)
  • 虚拟机栈的大小

    • 会抛出StackOverflowError
    • 不限定虚拟机栈的大小会随着方法的入栈最终导致OutOfMemoryError

本地方法栈:

  • 本地方法栈和虚拟机栈是很类似的;
  • 区别

    • Java虚拟机栈是为Java方法来服务的;
    • 本地方法栈是为native方法来服务的;
  • 它也一样有栈帧、局部变量表这些东西 ;

Java堆:

  • Java堆就是用来存储对象实例的;
  • 也是垃圾收集器管理的主要区域;
  • 分为新生代、老年代等;
  • -Xmx -Xms指定堆内存大小;

方法区:

  • JVM只有只有一个方法区,被所有线程共享;
  • 方法区实际上也是一块堆,只是用来存储类,常量相关的信息;
  • 用来存放程序中永远不变或唯一的内容(类信息[Class对象]、静态变量、字符串常量等)
  • 方法虚拟机存储加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;

    • 类的版本
    • 字段
    • 方法
    • 接口
  • 方法区和永久代
  • 垃圾回收在方法区的行为很少,回收效率低(常量池的回收,类的卸载等)
  • 运行时常量池

    • 运行时常量池的数据结构相当于一个HashSet,无序,不重复的
    • 两个相同的字符串引用记录同一个地址
    • String如果实在堆内存new出来的,调用string.intern()方法,如果常量池中有equals(s)的字符串,则返回该地址,如果常量池中没有,则在常量池中创建一个,并返回该地址

发表评论

表情:
评论列表 (有 0 条评论,155人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM内存区域

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个区域,这些区域各有自己的用途以及独特的创建和销毁时间,今天就来揭开这些不同的数据区域的神秘面纱 先...

    相关 JVM内存区域

    程序计数器 1.字节码解释器通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个程序计数器来完成。 2.每

    相关 JVM内存区域

    前言 说到Java内存区域,可能很多人第一反应是“堆栈”。首先堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序

    相关 JVM内存区域

    Java虚拟机所管理的内存包括以下几个运行时数据区域,如下图 ![20160706211017869][] 方法区 用于存储已经被虚拟机加载的类信息、常量、静态变量

    相关 JVM:Java内存区域

    1.简述 对于Java程序员来说,在虚拟机自动内存管理机制下,不需要关心内存的回收问题,但是一旦出现内存泄漏和溢出问题,如果不了解虚拟机是怎么管理内存的,那么问题排查工作

    相关 jvm内存区域

    jvm可以细分为: 方法区,堆,虚拟机栈,本地方法栈,程序计数器 线程共享区域:方法区和堆 线程独享区域:虚拟机栈,本地方法栈,程序计数器。 堆内存 堆内存是所