高频面试题-请聊一下JVM中堆和栈的区别!

简介: 在学习JVM的内存结构,将JVM中有哪些元素已经搞清了之后,根据之前的主题接着延伸一个更容易被面试官问到的题目。堆和栈的区别!这次我们就以下几个方面说一说有什么不同之处。

JVM对其的管理方式

虚拟机栈:线程结束后自动释放内存,无须垃圾回收。

堆:需要垃圾回收器进行回收(GC处理)。

运行效率

虚拟机栈:高; 堆:低。

空间大小

虚拟机栈:小。

堆:大,之前在内存架构篇里面说过,堆其实占据了JVM虚拟机内存的一大部分。

内存碎片

虚拟机栈:小,存放的数据少的同时,即使销毁后也不会留下太多碎片。

堆:大,首先是因为堆空间的大小比虚拟机栈的空间要大得多,活动量也较之大得多,即使垃圾回收器可以自动回收堆空间,再加上垃圾回收器的回收机制不是实时的,所以就会将内存碎片累积起来。

关于垃圾回收器相关知识,后期我会单独写一篇文章解释一下。

分配方式

虚拟机栈:一部分是静态分配内存,一部分是动态分配内存。

堆: 都是动态分配,因为在只有在程序运行过程中才会知道对象实例等数据具体需要多少内存。

说完了堆与栈的区别呢,接下来面试官可能还要问一下如何设置堆或者栈内存的初始值呢?

-Xms

设置堆内存初始值。

-Xss

设置虚拟机栈的内存大小。

-Xmx

设置堆可以占用内存的最大值。

加分项来了,顺势补充下面这句话,面试官就能足够相信你的知识够扎实了。

注:这个值一般与堆的初始值相同,因为当堆内存到达初始值时会进行自动扩容,扩容时就会造成一定的内存抖动,很有可能导致程序就此崩掉,或者是性能下降,对程序的稳定性有一定的影响。


目录
相关文章
|
6月前
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
9月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
356 9
|
9月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
396 12
|
9月前
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
169 9
|
10月前
|
Java
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
11月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
11月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
271 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
1300 2