校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 数据结构 >
题目

栈在堆上吗(阿里面试题)

解答

Java 栈(Stack)
1、Java 栈是与每一个线程关联的,JVM 在创建每一个线程的时候,会分配一定的栈空间给线程,Java Stack 为每个线程独享。
2、Java Stack 主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文(对象的引用), 以帧为单位保存线程的运行状态。
3、栈空间随着线程的终止而释放。
4、StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么 JVM 就会抛出此异常,这种情况一般是死递归造成的。

堆(Heap)
1、Java 中堆是由所有的线程共享的一块内存区域,堆用来保存各种 JAVA 对象,比如数组,线程对象等。
2、JVM 堆一般又可以分为以下三部分:新生代、老年代、永久区:

Perm(永久区)
Perm 代主要保存 class(类,包括接口等),method(方法),filed(属性) 等元数据,这部分的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的 class 没有被卸载掉,这样就造成了大量的 class 对象保存在了 perm 中,这种情况下,一般重新启动应用服务器可以解决问题。

Tenured(年老代)
Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区,一般如果系统中用了 application 级别的缓存,缓存中的对象往往会被转移到这一区间。

Young(年轻代)
Young 区被划分为三部分,Eden(伊甸园) 区和两个大小严格相同的 Survivor(幸存者)区,其中 Survivor 区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用。
在 Young 区间变满的时候,minor GC 就会将存活的对象移到空闲的 Survivor 区间中,根据 JVM 的策略,在经过几次垃圾收集后,任然存活于 Survivor 的对象将被移动到 Tenured 区间

Apple app = new Apple(); app 引用存在栈里,引用地址对应对象 Apple 在堆里。

C 1条回复 评论
阿阑

认真看完了,浅显易懂,学习到了。

发表于 2022-10-16 22:00:00
0 0