JVM 面试必问 经典试题

一、什么情况下会发生栈内存溢出?

1、栈是线程私有的,栈的生命周期和线程一样,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引用;

2、当线程请求的栈深度超过了虚拟机允许的最大深度时,会抛出StackOverFlowError异常,方法递归调用肯可能会出现该问题;

3、调整参数-xss去调整jvm栈的大小

栈内存溢出指的是在程序的栈空间中分配了过多的内存,导致栈空间不足而导致的错误。常见的情况有:

  1. 递归调用过多:递归调用时,每次函数调用都会压入栈中,如果递归层次过深,栈空间就会被耗尽。
  2. 局部变量过多或变量过大:在函数内部声明过多或过大的局部变量,也会导致栈空间不足。
  3. 函数调用过多:如果在程序中频繁调用函数,每次调用都需要在栈中分配一定的空间,也会导致栈空间不足。
  4. 栈空间设置过小:如果程序中需要分配的栈空间过大,而实际分配的栈空间过小,也会导致栈内存溢出。

二、详解JVM内存模型?

jvm将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区;

程序计数器(Program Counter,PC)是一种寄存器,用于指示当前正在执行的指令的地址或下一条指令的地址。在计算机处理器中,每个线程都有自己的程序计数器。当线程执行时,程序计数器中存储的是下一条指令的地址。当线程执行该指令时,程序计数器会自动更新,指向下一条指令的地址。这样就可以确保线程在执行程序时,能够准确地跟踪程序的执行顺序。

程序计数器通常是一个特殊的寄存器,位于CPU的控制单元中。它的大小通常与地址总线宽度相同,例如32位计算机的程序计数器通常是32位。在一些特殊情况下,程序计数器可能会被用来存储其他信息,例如异常处理、线程切换等,但是在正常情况下,程序计数器主要用于存储当前执行的指令的地址。

程序计数器的作用可以总结为:

  1. 记录当前正在执行的指令的地址或下一条指令的地址。
  2. 确保线程能够准确地跟踪程序的执行顺序。
  3. 在线程切换时,保存线程当前执行的状态,以便下次恢复执行。

程序计数器是计算机处理器中非常重要的组成部分之一,也是实现线程切换和异常处理等机制的基础。

虚拟机栈(Virtual Machine Stack),也称为Java虚拟机栈,是Java虚拟机中的一块重要的内存区域,用于存储方法调用时的相关信息和局部变量等。每个线程在执行的过程中都有一个独立的虚拟机栈,用于存储该线程所执行的方法的状态信息。

虚拟机栈以栈的形式组织,每个栈帧对应着一个方法的调用,栈帧中存储了方法的局部变量表、操作数栈、动态链接、方法返回地址以及一些额外的附加信息。每当一个方法被调用时,虚拟机就会为该方法创建一个新的栈帧,并将该栈帧压入虚拟机栈的顶部。当方法执行完毕后,虚拟机就会将该栈帧弹出,并释放相应的资源。

虚拟机栈的大小是固定的,可以在虚拟机启动时指定,默认情况下,每个线程的虚拟机栈大小为1MB。如果虚拟机栈的空间不足,就会抛出栈内存溢出异常。虚拟机栈还有一个重要的特性,它是线程私有的,也就是说,每个线程都有自己独立的虚拟机栈,不会被其他线程访问。

总之,虚拟机栈是Java虚拟机中重要的内存区域之一,用于存储方法调用时的相关信息和局部变量等。它以

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值