您的位置:首页 > 编程语言 > Java开发

Java内存对象的逃逸分析

2011-03-10 22:14 330 查看
看ThreadLocal时,看到 http://www.javaeye.com/topic/179040?page=2#510062 因此,又转到 “Java内存对象的逃逸分析”



http://blog.sina.com.cn/s/blog_4b6047bc01000avq.html





下面是我看此文章时的笔记,有可能有立即错误的地方,请仔细斟酌,以防被我误导



逃逸分析(Escape Analysis)是分析 指针动态范围 的方法,这同 指针分析外形分析 相关联



原作者这么说:

当变量(或者对象)在方法中分配后,其指针被返回或者被全局引用(这样就会被其他过程或者线程所引用),这种现象称作指针(或者引用)的逃逸(Escape)。



static V global_v;
public void a_method(){
   V v=b_method();
   c_method();
}
public V b_method(){
   V v=new V();
   return v;
}
public void c_method(){
   global_v=new V();
}


其中b_method方法内部生成的V对象的引用被返回给a_method方法内的变量v,c_method方法内生成的V对象被赋给了全局变量global_v。这两种场景都发生了指针(引用)逃逸。





但是,我的理解是这样的:

只要这个引用有可能会被多个线程所引用,这就发生了逃逸。像下面的代码,没有返回引用,也没有赋值给 static 的变量,我的理解,这里依然发生了逃逸

public void my_method(){
   final V v= new V();
   new Thread(){
        public void run(){
            // use v
        }
   }
}


原作者的例子中,b_method并没有逃逸,因为,最终,在a_method中,b_method返回的引用还是没有可能被多个线程所引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: