JVM学习笔记(一)之内存分区

本文详细介绍了JVM中线程私有和线程共享内存区的组成,包括PC寄存器、Java栈、本地方法栈、堆区、方法区及运行时常量池等,并解释了它们的功能与作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM中内存区可以根据受访问权限的不同定义为线程共享线程私有两大类。以下是我学习的一些笔记,这些知识是基于java7的,java7以后的版本会有点不同,但是大同小异,核心是不会变的。

一、线程私有内存区

1、PC寄存器(PC计数器)

  • 如果线程执行的方法是个java方法,那么pc寄存器就会存储正在执行的字节码指令的地址 ,如果是native方法,这时候pc寄存器就是空(undefined);
  • 所谓多线程在一个特定的时间内只会执行其中某一个线程方法,cpu会不断作任务切换,所以为每一个线程都分配一个pc寄存器
  • JVM字节码解析器通过改变寄存器的值来明确下一条该执行什么指令;
  • pc寄存器是唯一一个没有明确规定要抛出OutofMemeryError的运行时内存区。

2、Java栈

  • 线程私有,生命周期与线程的周期保持一致
  • 用于存储栈帧,栈帧中存储局部变量表(各类原始数据类型,对象引用以及returnAddress类型);
  • 可被允许实现成固定大小的内存或者可动态扩展的内存大小,如果被设定为固定内存,一旦线程请求分配的栈容量超过jvm所允许的最大值,则会抛出StackOverFlowError,反之会抛出一个OutOfMemoryError。

3、本地方法栈

  • 用于支持本地方法,比如C/C++的执行的区域地址。

    二、线程私有内存区

1、堆区

  • 堆区是用于存储对象实例的内存区,是GC执行垃圾回收的重点区域,是线程共享的;
  • 堆的大小在jvm启动时就已经设定好,通过-Xmx设置最大内存,-Xms设置起始内存,一旦超过“Xmx”,抛出内存溢出错误;
  • 内存空间不连续。

2、方法区

  • 线程共享;
  • 存储每一个java类的结构信息,如:运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容及类,实例,接口初始化时需要的特殊方法等;
  • 包含在java堆内,物理上属于堆的一部分;
  • 内存空间不连续;
  • 通过“-XX:MaxPermsize”制定最大内存,超过则抛出OOM错误。

3、运行时常量池

  • 属于方法区的一部分;
  • 当类加载器成功为一个类或接口装载进jvm后,就会创建与之对应的运行时常量池所需内存,如果超过方法区提供的最大值,会抛出OOM错误。

4、性能监控区

  • Prims模块的子模块PERF;
  • 用于监控jvm内部的perf data计数器,是jvm提供的一块内存共享区,专供外部程序访问这块区域的Perf-Data,实现外部程序监控Jvm的性能指标。
内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值