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)。
其中b_method方法内部生成的V对象的引用被返回给a_method方法内的变量v,c_method方法内生成的V对象被赋给了全局变量global_v。这两种场景都发生了指针(引用)逃逸。
但是,我的理解是这样的:
只要这个引用有可能会被多个线程所引用,这就发生了逃逸。像下面的代码,没有返回引用,也没有赋值给 static 的变量,我的理解,这里依然发生了逃逸
原作者的例子中,b_method并没有逃逸,因为,最终,在a_method中,b_method返回的引用还是没有可能被多个线程所引用
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返回的引用还是没有可能被多个线程所引用
相关文章推荐
- Java内存对象的逃逸分析
- Java内存对象的逃逸分析
- Java之内存分析和String对象
- 第十三、Java面向对象之内存分析
- Java之内存分析和String对象
- java对象占用内存分析
- Java对象内存占用分析
- Java之内存分析和String对象
- Java对象创建过程和内存结构分析
- 【JVM学习】Java的家园----JVM内存区域分析与对象的内存分配和访问
- Java中的垃圾回收问题以及在创建对象的时候的内存的分析
- JAVA 对象内存分析
- Java学习笔记-类与对象(对象内存分析)
- JAVA(八)java面向对象2-变量和内存分析
- Java对象内存布局 - 小分析
- 源码分析:Java对象的内存分配
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java中的逃逸分析和TLAB以及Java对象分配
- Java对象内存占用分析