JVM面试——运行时数据区

一:JVM的运行时内存区域是怎样的?

根据Java虚拟机规范的定义,JVM的运行时内存区域主要由程序计数器、虚拟机栈、本地方法
栈、Java堆、方法区和以及运行时常量池组成。其中堆、方法区以及运行时常量池是线程之间共享的区域,而栈(本地方法栈+虚拟机栈)、程序计数器都是线程独享的。
程序计数器:是用来存储指向下一条指令的地址,也即将要执行的指令代码,由执行引擎读取下一条指令,是线程私有的 、不会存在内存溢出。
Java虚拟机栈:一种线程私有的存储器,用于存储Java中的局部变量,每次方法调用都会创建一个栈帧,该栈帧用于存储局部变量,操作数栈,动态链接,方法返回地址等信息。当方法执行完毕之后,这个栈帧就会被弹出,变量作用域就会结束,数据就会从栈中消失。
本地方法栈:本地方法栈中存放本地方法(Native Method)的参数和局部变量,以及其他于些附加信息。这些本地方法一般是用C等本地语言实现的,虚拟机在执行这些方法时就会通过本地方法栈来调用这些本地方法
Java堆:是存储对象实例的运行时内存区域,几乎所有的对象实例都要在上面分配内存,占据着虚拟机内存总量的一大部分。此外,Java堆还用于垃圾回收,虚拟机发现没有被引用的对象时,就会对堆中对象进行垃圾回收,释放内存空间。
方法区:用于存储已被加载的类信息、常量、静态变量、即时编译后的代码等数据的内存区域。每加载一个类,方法区就会分配一定的内存空间,用于存储该类的相关信息,方法区的具体实现形式可以有多种,比如永久代、元空间等。
运行时常量池:是方法区的一部分。用于存储编译阶段生成的信息,主要有字面量和符号引用常量两类。其中符号引用常量包括了类的全限定名称、字段的名称和描述符、方法的名称和描述符。

二:内存泄漏和内存溢出的区别是什么?

内存泄漏:程序中分配的内存不再需要时,没有被正确释放或回收的情况。
内存溢出:程序试图分配的内存,超过其可用的内存的空间,常见的内存溢出情况包括栈溢出和堆溢出。
一般来说,内存泄漏是会导致内存溢出的,因为内存泄漏会导致部分内存一直无法被回收,久而久之就会没有内存可以分配,就会导致内存溢出。

三:OutOfMemory和StackOverflow的区别是什么?

OutOfMemory 是内存溢出错误,通常发生在程序试图分配内存时,但是超出可用内存限制
StackOverflow 是栈溢出错误,每次函数调用都会在栈上分配一些内存,当递归调用或者函数调用层次过深时,栈空间会被耗尽,从而导致StackOverflowError。

四:Java的堆是如何分代的?为什么分代?

Java 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间
新生区:由年轻区(Eden)、Survivor区组成(From Survivor、ToSurvivor)。默认情况下,新生代的Eden区和Survivor区的空间大小比例是8:2,可以通过参数调整。
为什么分代:Java中的大部分对象都是朝生夕死的,同时也有一部分对象会持久存在。如果把这两部分对象放到一起分析和回收,这样效率实在是太低了。通过将不同时期的对象存储在不同的内存池中,就可以节省宝贵的时间和空间,从而改善系统的性能。

五:新生区如果只有一个Eden+一个Survivor可以吗?

不行,如果只有两个区域,也能实现复制算法,但是会大大浪费空间。

六:Java中的对象一定在堆上分配内存吗?

不一定,在java虚拟机中,存在JIT优化的机制,JIT优化中可能会进行逃逸分析,经过逃逸分析发现某一个局部对象没有逃逸到方法外的话,那么这个对象就可能不会在堆上分配内存,而是进行栈上分配。

七:虚拟机中的堆一定是线程共享的吗?

不一定,为了保证对象的内存分配过程中的线程安全性,虚拟机提供了一种叫做TLAB的技术。
在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,当需要分配内存时,就在自己的空间上分配,这样就不存在竞争的情况。可以大大提升分配效率。

八:什么是方法区?是如何实现的?

方法区是Java虚拟机规范定义的一块用于存储类信息、常量、静态变量、编译器编译后的代
码等数据的内存区域。方法区时一种规范,而永久代和元空间是它的一种实现方式

九:字符串常量池是如何实现的?

字符串常量池是Java中一块特殊的内存区域,用于存储字符串常量。
在JDK 1.6及之前的版本,字符串常量池通常被实现为方法区的一部分,即永久代(Permanent
Generation),用于存储类信息、常量池、静态变量、即时编译器编译后的代码等数据。
从JDK 1.7开始,字符串常量池不再位于永久代,而是直接存放在堆中,之所以要挪到堆内存中,主要原因是因为永久代的 GC 回收效率太低,只有在FullGC的时候才会被执行回收。将字符串常量池放到堆中,能够更高效的回收字符串内存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值