不会吧!不会还不知道jvm组成吧!java内存区域与内存溢出异常-JVM组成

Java内存区域与内存溢出异常—JVM组成介绍

写的这一章只是前奏

JVM是C/C++写的(native)

C++/C程序开发人员在内存管理领域 拥有最高的权限 拥有最高的权力却干着最底层的活 负担每一个对象生命的开始到结束维护责任

·在这里插入图片描述

为什么要学内存管理Java虚拟机

Java程序员把内存分配的权力给java虚拟机,如果不了解java虚拟机的怎么使用内存排查错误

java 虚拟机图

在这里插入图片描述

重点来了!!! 这些都是必须理解背会的

程序计数器(篇幅太长了,我一条一条的列比较清晰)

Program Counter Register 是

1、一块较小的内存空间

2、可以看作是显示字节码文件(.class)行号显示器

3、字节码解释器工作时通过改变这个程序计数器的值来改变下一条语句执行

4、多线程条件下 java虚拟机通过线程轮流切换 分配处理器执行的时间的方式来实现的在任何一个一个语句 执行完之后恢复到正确的执行位置

5、线程私有内存:多线程下每条线程都有一个独立的程序计数器 各条线程之间计数器互不影响独立存储

6、如果正在执行java方法这个计数器记录的时正在执行的虚拟机指令的地址 如果正在执行的本地(Native)方法 这个计数器的值为空(Undefined),这个内存区是唯一一个在虚拟机规范里面没有OOM情况的区域

Java虚拟机栈

1、java虚拟机栈也是线程私有的 他的生命周期与线程相同

2、虚拟机栈描述的java方法执行的线程内存模型 每个方法执行的 时候 java虚拟机都会同步创建一个栈帧 用于存储 局部变量 操作数栈 动态连接 方法出口 每一方法被调用直至执行完毕过程就对应着一个栈帧在虚拟机入栈到出栈的过程

3、我们最关心的栈 经常讲的就是虚拟机栈或者更多的时候将的是虚拟机栈中部分变量表部分

4、局部变量表存放编译器可知的各种java虚拟机基本数据类型 对象引用或者是一条字节码指令地址

4、其中这个数据类型以局部变量槽来表示 其中long/double会占用两个变量槽,其余数据占用一个

5、HotSpot栈容量不是可以动态扩展的 所以hotspot是不会因为虚拟机栈无法扩展而导致OOM

本地方法栈

1、Native method stacks 与虚拟机栈发挥的作用是相似的

2、区别就是虚拟机栈为虚拟机执行java方法字节码服务 而本地方法栈则是为虚拟机使用到的本地方法服务

java堆

1、java heap 是虚拟机管理的内存最大的一块

2、java堆是被所有线程共享的一块内存区域在虚拟机启动时创建

3、heap唯一的目的就是存放对象实例

4、但是现在因为逃逸分析技术日渐强大 栈上分配标量替换优化手段已经导致发生悄然变化 java对象分配在堆上也是不怎么绝对了

5、java heap 时垃圾收集去管理的内存的区域 根据垃圾收集器的理论设计分为新生代、老年代……这写概念仅仅时一部分垃圾收集器的共性设计风格而不是当初设计设计时就划分的 现在这些情况也是在慢慢改变了

6、Java heap划分出很多线程私有的分配缓冲区 提升对象分配时的效率

7、将heap进行细分的目的也是为了更好的回收内存或者更好的分配内存

方法区

1、方法区和Java堆一样 是各个线程共享的内存区域

2、存储已被虚拟机加载的类型信息常量静态变量即时编译器编译后的代码缓存数据

3、永久代实现了方法区 是的HotSpot的垃圾收集器能够象管理Java堆一样管理这部分内存省区专门为方法编写内存管理代码的工作

4、这个设计导致了java 应用更容遇到内存溢出问题

5、为了解决这个问题jdk7把原有的永久带字符串常量池静态变量溢出 jdk8完全废弃了永久代概念 改成元空间把永久代剩余的内容全部移到元空间

6、垃圾收集行为在这个区域是比较出现的 但并非数据进入了方法区就永久存在了 内存回收目标主要针对常量池的回收和对类型的卸载 一般来说这个区域的回收效果不让人满意 但是对这个区域垃圾回收时必要的

运行时常量池

1、Runtime ConstantPool 是方法区的一部分 Class 文件除了有类的版本字段 方法接口等描述信息还有一项信息常量池表用于存放编译期生成的各种字面量与符号引用这部分内容将在类加载后方法后存放到方法区的运行时

2、java虚拟机对于CLass 文件的每一个部分都有严格的规定

3、运行时常量池相对class 文件常量池的另一个重要特征是具备动态性java 语言 运行期间可以将新的常量放入池中这种特性利用比较多的String类的intern方法

4、常量池是方法区的一部分也会收到内存限制

直接内存

1、直接内存不是虚拟机运行时数据区的一份 也不是定义的内存区域 但是这部分时频繁的使用也可能导致OOM异常

2、NIO基于 通道可以使用native函数库直接分配堆外内存 然后存储在堆里 避免java 堆native堆来回复制数据

3、物理机内存限制java堆的大小 一般管理配置虚拟机参数时所有的内存都方法在一块总数大于物理内存限制会出现OOM异常
ative函数库直接分配堆外内存 然后存储在堆里 避免java 堆native堆来回复制数据

3、物理机内存限制java堆的大小 一般管理配置虚拟机参数时所有的内存都方法在一块总数大于物理内存限制会出现OOM异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值