一文读懂什么是JVM内存区域

一、

1、什么叫做java内存区域

什么是内存?

在计算机硬件中,内存指的是cpu运算时,用于暂时存放cpu运算过程中的数据的区域,主要负责从固存中提取cpu运算需要的数据并将cpu运算结果如要保存到固定存储中则保存的一块断电后其所含有的数据便会消失的存储数据硬件。(个人理解)

那什么叫java内存区域

理解了什么是内存的话,java内存区域也就理解了,即java程序(这里指的java程序是什么意思?肯定是指用java代码写的程序,准确的说是用到java虚拟机的程序,即指打包好的程序也只开发时的程序即只要用到java虚拟机就是java程序)在运行时候的cpu计算产生的数据所存放的区域。(个人理解)

2、内存溢出异常

指某一程序或其程序中的容器所包含的内容超过了属于自己的内存大小造成程序的中断。

 

二、运行时的数据区域

1、数据区域的概念同java的内存区域

2、数据区域的分类

1、随Java虚拟机的存在而一直存在

 

2、随某一程序(用户线程)的存在而存在

 

3、分区

               

线程独占区/

随某一进程存在而存在

程序计数器

当前线程所执行字节码的行号指示器

栈:方法执行的线程的

内存模型

JVM栈

1、每个方法执行的时候会JVM创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。

2、细说局部变量表

1、编译期可知的基本数据类型(boolean,byte,char,short,int,float,long,double)和对象引用(对象的地址、对象的句柄、与对象位置相关的信息)

2、存储单位是:局部变量槽(slot)--4字节一个

除long,double为两个slot组成,其余数据类型均占一个slot

3、编译器已知方法的需要在栈帧分配多大(这里多大指的是slot数量)

3、StackOverflow-->请求的栈深度大于虚拟机所允许的深度

Outofmemoryerror-->栈扩展时无法申请到足够的内存

本地方法栈

为本地方法服务

线程共享区域/

随JVM存在而存在

堆内存/java堆

1、随虚拟器的启动而创建

存放对象实例

2、垃圾收集器管理的区域

3、分配内存

4、可存放于物理上不连续的内存空间

可固定大小也可扩展(设置 -Xmx -Xms设定)

方法区

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

2、JDK8之前有永久代的概念

JDK8之后用元空间替代

3、运行时常量池

1、常量池表:编译期生成的各种字面量与符号引用

2、具备动态性

常量不一定要在编译期产生也可在运行期产生

直接内存

1、不是虚拟机运行时数据区域的一部分

2、NIO引用一种基于通道与缓冲区的I/O方式,使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作

发布了26 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41926640/article/details/104320530