栈上分配
通过jvm内存分配可以知道java中的对象都是在堆中进行分配的, 当对象没有被引用的时候, 需要依靠gc进行回收内存, 如果对象数量较多的时候, 会给gc带来较大的压力, 也间接影响了应用的性能.为了减少临时对象在堆内分配的数量, jvm通过逃逸分析确定该对象会不会对外部访问.如果不会逃逸可以将该对象在栈上分配.这样的话该对象所占用的内存空间就可以随着栈帧出栈而销毁, 就减轻了垃圾回收的压力.
对象逃逸分析
就是分析该对象动态的作用域, 当一个对象在方法中被定义后, 他可能被外部方法所引用.例如作为参数传递到其他方法中.
jdk7之后默认开启逃逸分析.
开启: -XX:+DoEscapeAnalysis
关闭: -XX:-DoEscapeAnalysis
标量替换
通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时. jvm不会创建该对象,而是将对象成员变量分解若干个被这个方法使用的成员变量所代替, 这些代替的成员变量在栈帧或者寄存器分配空间, 这样就不会因为没有一大块连续的空间导致对象内存不够分配.
jdk7之后默认开启标量替换
开启: -XX:+EliminateAllocations
关闭: -XX:-EliminateAllocations
代码示例
1 | |
javac AllotOnStack.java 编译
java -Xmx15m -Xms15m -XX:-DoEscapeAnalysis -XX:+PrintGC -XX:+EliminateAllocations AllotOnStack 运行
栈上分配
https://zhaops-hub.github.io/2025/07/25/八股文/对外开放的文档/栈上分配/