jvm内存模型、调优、四种引用状态、内存泄漏、内存溢出

一、jvm内存模型

Java中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作内存,当线程与内存区域进行交互时,数据从主存拷贝到工作内存,进而交由线程处理
根据JVM规范,JVM 内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分。

在这里插入图片描述

1.1、 程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
首先,为什么是线程私有?
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,也就是说,在同一时刻一个处理器内核只会执行一条线程,处理器切换线程时并不会记录上一个线程执行到哪个位置,所以为了线程切换后依然能恢复到原位,每条线程都需要有各自独立的程序计数器。
1.2、 java 虚拟机栈(线程私有)
1.2.1 概述
在这里插入图片描述

1.Java虚拟机栈也是线程私有的,它的生命周期与线程相同(随线程而生,随线程而灭)
  2. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
   如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常;
  (当前大部分JVM都可以动态扩展,只不过JVM规范也允许固定长度的虚拟机栈)
  3. Java虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的同时会创建一个栈帧。
   对于我们来说,主要关注的stack栈内存,就是虚拟机栈中局部变量表部分。
1.2.2 栈帧(Stack Frame)
  栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的java虚拟机栈的栈元素。
  栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。

注意:
在编译程序代码的时候,栈帧中需要多大的局部变量表内存,多深的操作数栈都已经完全确定了。

因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
  栈结构图如下:
   在这里插入图片描述

注意:
  在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。
  执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
1.2.3 局部变量表
   1.局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
    并且在Java编译为Class文件时,就已经确定了该方法所需要分配的局部变量表的最大容量。
   2.局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)「String是引用类型」,
    对象引用(reference类型) 和 returnAddress类型(它指向了一条字节码指令的地址)
  注意:
  很多人说:基本数据和对象引用存储在栈中。
  当然这种说法虽然是正确的,但是很不严谨,只能说这种说法针对的是局部变量。
  局部变量存储在局部变量表中,随着线程而生,线程而灭。并且线程间数据不共享。
  但是,如果是成员变量,或者定义在方法外对象的引用,它们存储在堆中。
  因为在堆中,是线程共享数据的,并且栈帧里的命名就已经清楚的划分了界限 : 局部变量表!
1.2.4 操作数栈
每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以称之为表达式栈,操作数栈,在方法执行过程中,根据字节码指令,往栈中写入或提取数据,即入栈(push)/出栈(pop)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值