本文将从内存分配层面详解描述一个对象从生到死的过程
在java世界里,“几乎”所有的对象实例都在这里分配内存,而这里的几乎由于即时编译技术的进步,尤其是逃逸分析技术的日益强大, 使得对象可以在栈上分配
首先给出整体过程
前提:本文的回收过程仍以分代GC回收器为基础
栈上分配(默认开启)
不同于大家所熟知的对象分配在堆空间中,在GC中会回收堆中不再使用的对象,但标记筛选以及回收整理空间都需要消耗大量资源,所以如果一个对象能分配在栈空间中,不在使用时可以直接随栈帧的弹出而销毁,减少垃圾回收系统的压力
那么该如何实现呢?
首先我们需要对对象进行逃逸分析,如果对象的作用域跳出方法体,被外部方法所引用那么称其为方法逃逸,如果能被外部线程访问到,那么称其为线程逃逸,栈上分配可以支持方法逃逸,但不能支持线程逃逸
//如果所示,person的作用域跳出了方法体,称为方法逃逸
private Person person;
public void setPerson(){
person= new Person ();
person.setName(