> 历史文化
java卡片(java卡片布局如何加组件)
在生活中,很多人可能想了解和弄清楚Java卡表的设计及带来的问题的相关问题?那么关于java卡片的答案我来给大家详细解答下。
卡表的设计
通常将堆空间划分为一系列2次幂大小的卡页(Card Page)。卡表用于标记卡页的状态,每个卡表项对应一个卡页。
HotSpot JVM的卡页大小为512字节,卡表被实现了一个简单的字节数组,即卡表的每个标记项为1个字节。
当一个对象引用进行写操作时(对象引用改变),写屏障逻辑将会标记对象所在的卡页为dirty。
首先,计算对象引用所在的卡页的卡表索引号。将地址右移9位,相当于用地址除以512(2的9次方)。可以这么理解,假设卡表卡页的起始位置为0,那么卡表项0、1、2对应的卡页起始地址分别为0、512、1024(卡表项索引乘以卡页512字节)
其次、通过卡表索引号,设置对应标识为dirty
卡表带来的问题
1、无条件写屏障带来的性能开销
2、高并发下虚共享带来的性能开销
解决方案:不采用无条件的写屏障,而是先检查卡表标识,只有当该卡表项未被标记过才将其标记为dirty。Java7 引入了一个新的参数-XX:+UseCondCarMark,在执行写屏障之前,先简单的做下判断。如果卡页已被标识过,则不再进行标识。
温馨提示:通过以上关于Java卡表的设计及带来的问题内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。