论坛首页 Java企业应用论坛

JVM内存管理:深入Java内存区域与OOM

浏览 54601 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-11-07  
fantasy 写道


标量类型? 英文是什么?我们一般叫基本类型吧?

 

 

Scalar Type

 

这个翻译应该没有问题,譬如说"Scalar Replacement",也许“基本类型替换”会来的跟好懂一些,但翻译为"标量替换"应该更符合习惯。

 

这篇文章纠结于英文词汇在中文中怎么说这很无趣。

 

刚刚有同学发现了个问题,PM给我,这里修正一下,感谢renwolang521同学

 

 


规则一:-XX:SurvivorRatio=8决定了新生代中eden与survivor的空间比例是1:8 

 

 

这里有个错误,应该是8:1

0 请登录后投票
   发表时间:2010-11-08  
IcyFenix 写道
vtudiv 写道
其中long和double会占用2个本地变量空间(32bit),其余占用1个。
这句话什么意思?


根据VM Spec的规定,超过32位大小的数据,VM是把他们当做2个32位数据代替,每次get/set其实都执行了2次操作,而小于等于32位的数据类型,只需要执行1次。因此小于等于32位的类型访问是原子操作,而long和double的访问是非原子操作,这个在并发程序中需要注意,可以通过volatile关键字来保证原子性。

上述描述对32位虚拟机有效,64位未做过研究,不评论。

非常感谢~
0 请登录后投票
   发表时间:2010-11-10  
太深入了。待了解。
0 请登录后投票
   发表时间:2010-11-13  
赞,楼主的功力深厚~
0 请登录后投票
   发表时间:2010-11-15  
好文章啊,尤其是对oom的解释和分类
0 请登录后投票
   发表时间:2010-12-13  
非常棒,实例能让人更好的理解
0 请登录后投票
   发表时间:2010-12-14  
在VM Spec中对这个区域规定了2中异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈可以动态扩展(VM Spec中允许固定长度的VM栈),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。
-------------------------------------------------------------------------
是否详细的讲一下这段?
0 请登录后投票
   发表时间:2010-12-21  
关于大家所说的这些vm内存分配,我有些不懂,还请大家指教。我们老师再给我们做内存分析的时候,所java在内存中分为heap、stack、data segment、code segment四部分,而heap是放对象等new出来的东西,而stack则是放引用和局部变量的内存块,data怎是放类变量和字符串常量的,code是放代码的内存。而大家所说的常量池、方法区等等是怎么分的,求给为详解。
0 请登录后投票
   发表时间:2010-12-22  
IcyFenix 写道
vtudiv 写道
其中long和double会占用2个本地变量空间(32bit),其余占用1个。
这句话什么意思?


根据VM Spec的规定,超过32位大小的数据,VM是把他们当做2个32位数据代替,每次get/set其实都执行了2次操作,而小于等于32位的数据类型,只需要执行1次。因此小于等于32位的类型访问是原子操作,而long和double的访问是非原子操作,这个在并发程序中需要注意,可以通过volatile关键字来保证原子性。

上述描述对32位虚拟机有效,64位未做过研究,不评论。

java中对一个变量的读写肯定是原子操作的,不会出现只到到一半就被中断的情况
0 请登录后投票
   发表时间:2010-12-22  
asle 写道
IcyFenix 写道
vtudiv 写道
其中long和double会占用2个本地变量空间(32bit),其余占用1个。
这句话什么意思?


根据VM Spec的规定,超过32位大小的数据,VM是把他们当做2个32位数据代替,每次get/set其实都执行了2次操作,而小于等于32位的数据类型,只需要执行1次。因此小于等于32位的类型访问是原子操作,而long和double的访问是非原子操作,这个在并发程序中需要注意,可以通过volatile关键字来保证原子性。

上述描述对32位虚拟机有效,64位未做过研究,不评论。


java中对一个变量的读写肯定是原子操作的,不会出现只到到一半就被中断的情况


如果你说的是特定某种虚拟机实现,那这个问题可以继续讨论,因为具体实现中可以选择把这个操作实现为原子的,这点是允许的(“An implementation is free to implement load, store, read, and write operations for double and long values as atomic 64-bit operations”)。

但如果你说的是仅仅是“java中”,那我想这个问题还是遵循虚拟机规范来的妥当一些。

在虚拟机规范第二版8.4节“Nonatomic Treatment of double and long Variables”中关于double和long变量描述如下:

引用

If a double or long variable is not declared volatile, then for the purposes of load, store, read, and write operations it is treated as if it were two variables of 32 bits each; wherever the rules require one of these operations, two such operations are performed, one for each 32-bit half. The manner in which the 64 bits of a double or long variable are encoded into two 32-bit quantities and the order of the operations on the halves of the variables are not defined by The Java  Language Specification.

This matters only because a read or write of a double or long variable may be handled by an actual main memory as two 32-bit read or write operations that may be separated in time, with other operations coming between them. Consequently, if two threads concurrently assign distinct values to the same shared non-volatile double or long variable, a subsequent use of that variable may obtain a value that is not equal to either of the assigned values, but rather some implementation-dependent mixture of the two values.


0 请登录后投票
论坛首页 Java企业应用版

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