常见面试题记录

https://blog.****.net/jackfrued/article/details/44921941

1. 解释内存中的栈(stack)、堆(heap)和方法区(method area)

1.1 存储类型

栈:存储通用类型的定义,记住只有-128~128的是引用同一个对象,若不在此范围则是新的对象 如f1=100,f2=100,f3=200,f4=200.  f1==f2(true),f3==f4(false)

       存储对象的引用以及函数调用的现场保存

堆:通过 new 关键字和构造器创建的对象都放在堆空间中,堆空间是垃圾收集器管理的主要区域。

       堆中的数据可以被所有的线程共享

方法区: 存储了所有 class 和 static 变量

                方法区中的数据也可以被所有线程共享

元空间:在 jdk1.8 之后,方法区被元空间取代

 

1.2 栈(stack)

1.2.1 栈的概念

栈是在程序运行时就预先分配好的内存空间,根据程序运行需求和配置来移动指针,进行内存分配。一般栈被用来存放一些基本的变量类型或引用对象的地址,内存空间小,当栈溢出时会抛出 StackOverflowError 异常

 

1.2.2 为什么栈的提取速度比堆快

● 栈的内存是预先分配好的,而堆的内存则是在使用的时候才去申请,且每次对内存的申请和归还都会比较消耗性能,开销较大

● cpu 中有专门的寄存器来处理操作栈,而堆里面都是使用间接寻址的方式进行对象查找的,无疑栈会更快一点

 

1.2.3 栈的数据共享

由于栈的存储空间有限,对于同一个数值,如a=10,b=10,jvm会先在栈中查找是否存在一个区域存放10,若有,则将变量的引用都指向10,若没有,则创建一个区域存放10,并将变量的引用指向它。

 

1.2.4 栈中到底存储了什么

栈中存储了局部变量表,操作数栈,动态链接以及返回地址

局部变量表:存储一系列的变量信息,如byte、short、long、char、boolean等

操作数栈:可以将指令在压入栈或弹出栈

动态链接:其作用主要是在栈中的对象进行实例化的时候,能够查找到堆里面响应的类地址,并引用

返回地址:当某个子方法执行完毕后,需要回到主方法的原有位置继续执行程序,方法出口主要就是记录该信息

 

1.3 堆(heap)

1.3.1 堆的概念

在代码中通过 new 关键字或是构造函数来创建的对象,都被分配在堆中。由于堆中存放了大量对象的信息,故堆是gc重点回收的一个模块,也可能是整个系统的性能瓶颈。当堆的内存不够造成堆溢出时,会抛出 OutOfMemoryError。

 

1.3.2 垃圾回收

关于垃圾回收的原理和分类?
可以看看我的另一篇文章:https://blog.****.net/Danny_idea/article/details/87475188
什么是指针逃逸?如何对此进行优化?
可以参考我的公众号文章:https://mp.weixin.qq.com/s/tyF9Ve40C_uu4rwcs4tUsg

 

1.4 方法区

常见面试题记录

方法区用于存储整个程序中永远唯一的元素,如已经被虚拟机加载的类信息、静态变量等

 

1.5 元空间

JDK8 HotSpot JVM 将移除方法区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)。这意味着不会再有java.lang.OutOfMemoryError: PermGen问题,也不再需要你进行调优及监控内存空间的使用

https://blog.****.net/u012834750/article/details/70160594