一、Java内存结构图

java项目为什么一调接口就内存溢出 java接口内存图_jvm

二、结构图的各个结构介绍

  • 程序计数器:保存当前线程执行的指令的地址
  • 虚拟机栈:存放一个个栈帧,而一个栈帧对应着一个Java方法
            栈帧:一种数据结构,包括局部变量表、操作数据栈、指向运行时常量池的引用(动态链接)、方法返回地址和额外的附加信息;一个方法对应一个栈帧,方法开始时创建压入栈帧,结束时弹出栈帧
  • 本地方法栈:跟虚拟机栈一样,但是对应的不是Java方法,而是本地Native方法,两个栈都会出现StackOverflowError异常和OutOfMemoryError异常
  • :存储真正对象和数组的一种数据结构;
           注意存数组的,而数组的引用在虚拟机栈中
           集合所有对象实例都在该区域进行内存分配
           注意1.7之后字符串常量池存放在堆中,字符串常量池中存储编译期间生成的字面量和符号引用
  • 方法区:存储每个类的信息、静态变量、常量和编译后的代码
           注意之前的字符串常量池放在方法区中的
           方法区中还有一个非常重要的部分是运行时常量池,它是每个类或接口运行时的表示形式,在类或接口被加载到JVM后,对应的运行时常量池就被创建出来,每个类或接口有一个运行时常量池
           除了class文件常量池中的内容能进入运行时常量池,在运行期间也可以将新的常量放入运行时常量池
  • 本地内存中的元数据区(元空间):元数据区跟方法区的功能一样,由于方法区容易出现性能问题和内存溢出,就在本地内存中使用元数据区替代它

谢谢阅读,如有不对之处请指出!