本文主要是介绍【Android面试八股文】Java对象会不会分配到栈中?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- Java对象会不会分配到栈中?
- 一、什么是`堆(Heap)` ,什么是`栈(Stack)`?
- 二、栈上分配的特殊情况:逃逸分析
- 逃逸分析
- 逃逸分析的触发前提条件必须触发JIT执行
- 如何在IDEA中关闭逃逸分析
- 对比开启和关闭逃逸分析的耗时
- 逃逸分析的局限性
- 总结
Java对象会不会分配到栈中?
一、什么是堆(Heap)
,什么是栈(Stack)
?
在Java中,对象的内存分配主要发生在堆(Heap)
中,而非栈(Stack)
。
- 堆内存:几乎所有的对象实例(包括数组实例)都分配在堆内存中。堆是共享的内存区域,可以被所有线程访问。
- 栈内存:栈内存存放局部变量和方法调用的栈帧(栈帧包含方法的局部变量表、操作数栈、动态链接和方法返回地址等)。每个线程都有自己的栈,不与其他线程共享。
二、栈上分配的特殊情况:逃逸分析
尽管Java对象
通常分配在堆
上,但有些情况下,编译器和JVM
可以进行优化
,使得对象在栈
上分配。这种优化称为逃逸分析(Escape Analysis)
。
逃逸分析
逃逸分析
指的是分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用。
- 方法逃逸
比如:调用参数传递到其他方法中,这种称之为方法逃逸
。 - 线程逃逸
这篇关于【Android面试八股文】Java对象会不会分配到栈中?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!