你见过老外的 Java 面试题吗 (上)?

前言

最近无聊的在逛某 tube 网站,本来想看看大家是怎么吐槽川普的,结果无意间点进了一个老外面试 Java 的视频,对于常年面试被吊打的我瑟瑟发抖,于是决定进去一探究竟。

毕竟不是专业的后台开发,所以我在面试到后台知识的时候果断的退了出来,才让自己免受了侮辱

不过鉴于我手速出众,飞速的记录下了 Java 的基础题,所以准备贡献出来,供大家享乐。

鉴于题目比较多,会分成上下 2 篇 来整理,主要是面对 Java 的基础,看看老外的面试题和我们有什么区别。

当然问题是老外问的,答案是我编的。

正文

Java 中有哪些可用的分配内存

Java 虚拟机在执行程序时候会将内存划分为不同的数据区域

  • 方法区 - Method Area
    • 方法区(Method Area)与 Java 堆一样,是所有线程共享的内存区域
    • 虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫 Non-Heap(非堆),目的应该是与 Java 堆区分开。
    • 运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本/字段/方法/接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将类在加载后进入方法区的运行时常量池中存放。运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的是 String.intern() 方法。受方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。
    • 方法区的大小和堆空间一样,可以选择固定大小也可选择可扩展,方法区的大小决定了系统可以放多少个类,如果系统类太多,会导致方法区溢出虚拟机同样会抛出内存溢出错误
    • JVM 关闭后方法区即被释放
  • 堆 - Heap Area
    • 对于大多数应用,Java 堆是 Java 虚拟机管理的内存中最大的一块,被所有线程共享。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数据都在这里分配内存。
    • Java 虚拟机规范规定,Java 堆可以是处于物理上不连续的内存空间中,只要逻辑上是连续的即可,像磁盘空间一样。实现时,既可以是固定大小,也可以是可扩展的,主流虚拟机都是可扩展的(通过 -Xmx-Xms 控制),如果堆中没有完成实例分配,并且堆无法再扩展时,就会抛出 OutOfMemoryError 异常。
  • 栈 - Stack Area
    • 栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
    • JVM 直接对虚拟机栈的操作只有两个:每个方法执行,伴随着入栈(进栈/压栈),方法执行结束出栈
    • 栈不存在垃圾回收问题
  • 程序计数器 - Program Counter Register
    • 它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域
    • 在 JVM 规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期一致
    • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。如果当前线程正在执行的是 Java 方法,程序计数器记录的是 JVM 字节码指令地址,如果是执行 native 方法,则是未指定值(undefined)
    • 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
    • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
    • 它是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域
  • 本地方法栈 - Native Method Stack Area
    • Java 虚拟机栈用于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用
    • 本地方法栈也是线程私有
    • 允许线程固定或者可动态扩展的内存大小
      • 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常
      • 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么 Java虚拟机将会抛出一个 OutofMemoryError 异常
    • 它的具体做法是 Mative Method Stack 中登记 native 方法,在 Execution Engine 执行时加载本地方法库当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。
    • 并不是所有 JVM 都支持本地方法。因为 Java 虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果 JVM 产品不打算支持 native 方法,也可以无需实现本地方法栈
    • 在 Hotspot JVM 中,直接将本地方法栈和虚拟机栈合二为一
  • </
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值