当前位置: 首页 > news >正文

【Java 内存区域】

Java内存区域

  • JDK1.7 VS JDK1.8
    • 堆 (Heap)
    • 方法区 (Method Area)
    • String 常量池 (String Pool)
    • 运行时常量池 (Runtime Constant Pool)
    • 虚拟机栈 (JVM Stack)
      • 局部变量表
      • 操作数栈
      • 动态链接
      • 方法返回信息
    • 本地方法栈 (Native Method Stack)
    • 程序计数器 (Program Counter Register)
    • 元空间

JDK1.7 VS JDK1.8

在这里插入图片描述

堆 (Heap)

  • 定义: 堆是Java虚拟机(JVM)中用于存放对象实例和数组的内存区域。它是Java内存管理的核心部分,负责动态分配内存。
  • 特点: 堆内存是线程共享的,所有线程都可以访问堆中的对象。堆空间也可以分为新生代和老年代,用于垃圾回收(GC)管理。

方法区 (Method Area)

  • 定义: 方法区是JVM中用于存储类的结构信息、常量、静态变量、即时编译器编译后的代码等数据的内存区域。
  • 特点: 方法区是所有线程共享的,存放类的元数据(如类的结构、方法的信息、字段的信息)和静态变量。

String 常量池 (String Pool)

  • 定义: String 常量池是JVM中用于优化String对象的存储的区域。它是方法区的一部分,用来存放被编译器识别为常量的String对象。
  • 特点: 如果多个String字面量(即在代码中直接写的字符串)有相同的值,那么这些字面量会被存储在常量池中,并且这些字符串对象是共享的。

运行时常量池 (Runtime Constant Pool)

  • 定义: 运行时常量池是方法区中的一个部分,用于存储编译期生成的各种字面量和符号引用。它是在类加载后创建的,并且可以动态添加常量。
  • 特点: 运行时常量池在运行时可以包含编译期间生成的常量和动态生成的常量。

虚拟机栈 (JVM Stack)

  • 定义: 虚拟机栈用于存储方法调用时的栈帧。每个线程在执行时都会有一个虚拟机栈,用于存储局部变量、操作数栈、动态链接和方法出口信息。
  • 特点: 每个线程都有自己的虚拟机栈,栈帧是线程私有的,栈帧的生命周期与方法的调用和返回相关。
  • 异常:
    • StackOverFlowError: 若栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误
    • OutOfMemoryError: 如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

在这里插入图片描述

局部变量表

  • 定义:存储方法的参数和局部变量。

-

操作数栈

  • 定义:存储计算过程中的临时数据和计算结果

动态链接

  • 定义:处理方法调用的符号引用到实际引用的解析。

方法返回信息

  • 定义:处理方法执行后的返回值和控制流转移。

本地方法栈 (Native Method Stack)

  • 定义: 本地方法栈与虚拟机栈类似,但是它专门用于处理本地方法(用C、C++等语言编写的方法)的调用。
  • 特点: 本地方法栈的结构与虚拟机栈相似,但它存储的是本地方法调用的相关信息,而不是Java方法调用的信息。
  • 异常:
    • StackOverFlowError: 若栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误
    • OutOfMemoryError: 如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

程序计数器 (Program Counter Register)

  • 定义: 程序计数器是一个小的内存空间,用于存储当前线程正在执行的字节码指令的地址。
  • 特点: 每个线程都有自己的程序计数器,线程切换时不会影响其他线程的程序计数器。程序计数器对于线程的执行顺序和调度是至关重要的。
  • 异常:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

元空间

  • 定义: 元空间是JVM中用于存储类元数据的内存区域。它负责存储类的结构信息,如类的定义、方法信息、字段信息等。
  • 特点:
    • 本地内存: 元空间的内存管理不再依赖于JVM堆,而是直接使用本地系统内存。这减少了由于方法区导致的内存管理问题。
    • 动态调整: 元空间的大小可以根据需要动态调整,JVM可以根据系统的内存情况来分配或回收空间。这有助于避免方法区的OutOfMemoryError问题。
    • 配置: 元空间的大小可以通过JVM参数进行配置。常用的参数包括:
      -XX:MetaspaceSize=: 设置元空间的初始大小。
      -XX:MaxMetaspaceSize=: 设置元空间的最大大小。
    • 垃圾回收: 元空间的垃圾回收会在类卸载时触发,这与旧版方法区的垃圾回收机制类似,但管理上更为灵活。
http://www.lryc.cn/news/428164.html

相关文章:

  • 你是如何克服编程学习中的挫折感的?
  • 【AI应用实战】灵办AI插件集成详细指南
  • MySQL数据库连接超时问题排查报告
  • 代码随想录第三天 | 链表
  • Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用
  • putty中修改默认窗口大小和字体、字号
  • Windows下网络编与ESP8266-WiFi通信(win32-API)
  • 【Golang】golang安装一些依赖包时总是失败
  • ubuntu如何监控Xvfb虚拟显示器
  • 小型需求管理软件盘点:8款功能强大的工具
  • Labelme的安装与使用教程
  • C#基础:数据库中使用Linq作分组处理(反射/直接分组)
  • Revite二次开发_使用WPF和WebView2制作一个访问网站的窗口
  • Java Spring Boot 连接数据库
  • Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景
  • springboot jar是如何启动的
  • Android 12系统源码_屏幕设备(二)DisplayAdapter和DisplayDevice的创建
  • 常用Mysql命令
  • IDEA Debug工具
  • ARM64的汇编资源
  • 实验室安全分级分类管理系统在高校中的具体应用
  • 使用 prerenderRoutes 进行预渲染路由
  • 【深度解析】WRF-LES与PALM微尺度气象大涡模拟
  • redis事件机制
  • 【C++】模拟实现vector
  • 【CAN-IDPS】汽车网关信息安全要求以及实验方法
  • EASE-Grid是啥东西?
  • 前端用户管理模块方法及api分析
  • microsoft edge怎么关闭安全搜索
  • Qt | QSQLite内存数据库增删改查