论坛首页 Java企业应用论坛

线程安全总结(二)

浏览 45425 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-11-11  
认真学习jvm的好机会,嘎嘎,攒!
0 请登录后投票
   发表时间:2010-11-11  
支持! 感谢楼主分享.
大家一起努力!
我也更要学习呀. 水平差距太远了. 呵呵.
0 请登录后投票
   发表时间:2010-11-11  
总结不错,还是建议想学习jvm的人,看看《深入jvm第二版》
0 请登录后投票
   发表时间:2010-11-11  
脱离jvm的静态内存模型再讲一点就更好了,谢谢
0 请登录后投票
   发表时间:2010-11-11  
讲得挺好的,主要是谈到了jvm的语义场景,能够帮助大伙解决很多困惑。
0 请登录后投票
   发表时间:2010-11-12  
楼主,等你的三。

0 请登录后投票
   发表时间:2010-11-12  
想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?
0 请登录后投票
   发表时间:2010-11-12  
beyondyuefei 写道
想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?


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

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

eden区的存在(包括三个代的划分)是为了jvm的内存高效率的分代gc,和线程同步并没有多大关系。
0 请登录后投票
   发表时间:2010-11-12  
jameswxx 写道
beyondyuefei 写道
想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?


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

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

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



可以分别设置JVM中那3个代的内存分配大小吗?
另外,程序中可以指定某个对象放在哪个代里面吗?
0 请登录后投票
   发表时间:2010-11-12   最后修改:2010-11-12
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后,新生代中没有被收集的对象会进入旧生代;有时候分配的较大对象也可能直接进入旧生代了。
0 请登录后投票
论坛首页 Java企业应用版

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