论坛首页 Java企业应用论坛

线程安全总结(二)

浏览 45177 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-11-12  
想来想去,这个帖子应该改个名称,叫同步的总结会比较合适。
0 请登录后投票
   发表时间:2010-11-12  
非常感谢~
学习~
0 请登录后投票
   发表时间:2010-11-12  
楼主的文章写的不错,看了一和二收获很大,期待楼主的三~
0 请登录后投票
   发表时间:2010-11-12  
jameswxx 写道
hardPass 写道
jameswxx 写道
beyondyuefei 写道
想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?


那本书我看过,印象中没这个说法,你可能理解有误。
从存储结构来看,eden区位于JVM堆内存的新生代中,新生代分为三部分:eden区,s0区,s1区。eden是伊甸园的意思,
s0区和s1区成为幸存区,堆内存是一个共享的空间,毫无疑问,eden也是共享的空间。但是你要搞清楚,内存空间共享并不等于这个空间中分配的对象是共享的。

为什么?因为线程有自己的私有栈,栈中的一部分区域存储了对堆中对象的内存地址引用,如果堆中某个对象被多个线程引用,那么它是共享的;如果堆中的对象分别被单个线程引用,例如线程的某个局部变量是个大对象,它是私有的。当堆中某个对象被多个线程引用,虽然它在eden区中,但是修改时必须加锁,这涉及到多线程并发问题。

eden区的存在(包括三个代的划分)是为了jvm的内存高效率的分代gc,和线程同步并没有多大关系。



可以分别设置JVM中那3个代的内存分配大小吗?
另外,程序中可以指定某个对象放在哪个代里面吗?


可以设置3个代的内存分配大小的,还可以设置每个代的垃圾收集器和收集算法。
对象被分配在哪个代里,这个是jvm控制的,这是合理的,如果人为干预,会破坏垃圾收集器的行为,gc的不确定性很大,可能会导致严重的内存泄露。一般来说,生命周期短的小对象被分配在eden,若干次minor gc后,新生代中没有被收集的对象会进入旧生代;有时候分配的较大对象也可能直接进入旧生代了。


请伟大的楼主详细介绍下如何设置3个代,包括每个代的内存分配大小以及其垃圾收集器和收集算法。

楼主威武!

0 请登录后投票
   发表时间:2010-11-17  
随着不断深入,最终还是会探究到底层的问题,无可避免
0 请登录后投票
   发表时间:2010-11-19  
期待“JVM内存与垃圾收集”,楼主写完后第一时间通知啊
0 请登录后投票
   发表时间:2010-11-19  
嗯 不错 明白了一章中的工作内存的概念了
0 请登录后投票
   发表时间:2011-05-17  
学习!加深了理解
0 请登录后投票
   发表时间:2011-06-09   最后修改:2011-06-09
《java分布式应用基础与实践》中介绍:为了防止操作共享内存加锁(保证可用字节指针的访问和修改是安全的),每个线程有一个TLAB区域,在这个区域每个线程创建对象对堆内存无需加锁

thread-local allocation buffer,TLAB,包含堆可用部分的一小块
0 请登录后投票
   发表时间:2011-06-10  
liwenjie 写道
《java分布式应用基础与实践》中介绍:为了防止操作共享内存加锁(保证可用字节指针的访问和修改是安全的),每个线程有一个TLAB区域,在这个区域每个线程创建对象对堆内存无需加锁

thread-local allocation buffer,TLAB,包含堆可用部分的一小块


恩,确实写了,之前我没注意到。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics