锁定老帖子 主题:线程安全总结(二)
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-11
认真学习jvm的好机会,嘎嘎,攒!
|
|
返回顶楼 | |
发表时间:2010-11-11
支持! 感谢楼主分享.
大家一起努力! 我也更要学习呀. 水平差距太远了. 呵呵. |
|
返回顶楼 | |
发表时间:2010-11-11
总结不错,还是建议想学习jvm的人,看看《深入jvm第二版》
|
|
返回顶楼 | |
发表时间:2010-11-11
脱离jvm的静态内存模型再讲一点就更好了,谢谢
|
|
返回顶楼 | |
发表时间:2010-11-11
讲得挺好的,主要是谈到了jvm的语义场景,能够帮助大伙解决很多困惑。
|
|
返回顶楼 | |
发表时间:2010-11-12
楼主,等你的三。
|
|
返回顶楼 | |
发表时间:2010-11-12
想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?
|
|
返回顶楼 | |
发表时间:2010-11-12
beyondyuefei 写道 想问一下,我看淘宝的林昊写的一书中说JVM堆中的新生代,是为每个线程独立的创建一个 eden区,否则共享对象都要加锁,会影响性能,放在每个线程独立的 eden区就不用加锁了,而你这里所说的 eden区貌似是共享的,你们2者的描述似乎不同,还是我理解有误 ?
那本书我看过,印象中没这个说法,你可能理解有误。 从存储结构来看,eden区位于JVM堆内存的新生代中,新生代分为三部分:eden区,s0区,s1区。eden是伊甸园的意思, s0区和s1区成为幸存区,堆内存是一个共享的空间,毫无疑问,eden也是共享的空间。但是你要搞清楚,内存空间共享并不等于这个空间中分配的对象是共享的。 为什么?因为线程有自己的私有栈,栈中的一部分区域存储了对堆中对象的内存地址引用,如果堆中某个对象被多个线程引用,那么它是共享的;如果堆中的对象分别被单个线程引用,例如线程的某个局部变量是个大对象,它是私有的。当堆中某个对象被多个线程引用,虽然它在eden区中,但是修改时必须加锁,这涉及到多线程并发问题。 eden区的存在(包括三个代的划分)是为了jvm的内存高效率的分代gc,和线程同步并没有多大关系。 |
|
返回顶楼 | |
发表时间: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个代的内存分配大小吗? 另外,程序中可以指定某个对象放在哪个代里面吗? |
|
返回顶楼 | |
发表时间: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后,新生代中没有被收集的对象会进入旧生代;有时候分配的较大对象也可能直接进入旧生代了。 |
|
返回顶楼 | |