快取是由多個快取行組成的,以快取行為基本單位,乙個快取行的大小一般為64位元組。
因為快取行存在,當不同的執行緒在操作兩份不同的資料時,如果這兩份資料剛好位於同乙個快取行中,那麼彼此之間就會互相影響。
所以為了解決偽共享的問題,就出現了快取行對齊的方式,也就是讓c、d兩份資料分別獨佔乙個快取行,這樣就不會互相影響了。
public
class
cachelinepadding
private
static
class
textends
padding
public
static t[
] arr =
newt[2
];static
public
static
void
main
(string[
] args)
throws exception })
; thread t2 =
newthread((
)->})
;final
long start = system.
nanotime()
; t1.
start()
; t2.
start()
; t1.
join()
; t2.
join()
; system.out.
println
((system.
nanotime()
- start)
/100000);
}}
上述**,可以自行測試,當有如下變數時,執行的速度會比沒有時更快。
public
volatile
long p1, p2, p3, p4, p5, p6, p7;
jdk8版本之後,提供了解決偽共享的註解,需要在啟動時新增如下配置-xx:-restrictcontended,然後使用sun.misc.contended註解即可。
public
class
cachelinepadding
public
static t[
] arr =
newt[2
];static
public
static
void
main
(string[
] args)
throws exception })
; thread t2 =
newthread((
)->})
;final
long start = system.
nanotime()
; t1.
start()
; t2.
start()
; t1.
join()
; t2.
join()
; system.out.
println
((system.
nanotime()
- start)
/100000);
}}
快取行對齊
快取記憶體控制器是針對資料塊,而不是位元組進行操作的。從程式設計的角度講,快取記憶體其實就是一組稱之為快取行 cache line 的固定大小的資料塊,其大小是以突發讀或者突發寫週期的大小 為基礎的。快取基本上來說就是把後面的資料載入到離cpu自己進的地方,對於cpu來說,它是不會乙個位元組乙個位元...
JVM 效能優化
最近發現服務cpu消耗不是很穩定,在150 600 之間不停跳動,以前沒有這種情況,check了一下,是old區記憶體不太夠導致每隔一小段時間cms gc了,old區記憶體不夠的主要原因是服務需要載入的資料變多了,使得old區頻繁gc 用 jmap heap pid 可以看到當old區佔比超過92 ...
CPU快取記憶體行對齊
cpu的快取記憶體一般分為一級快取和二級快取,現今更多的cpu更是提供了 快取。cpu在執行時首先從一級快取讀取資料,如果讀取失敗則會從二級快取讀取資料,如果仍然失敗則再從記憶體中存讀取資料。而cpu從一級快取或二級快取或主記憶體中最終讀取到資料所耗費的時鐘週期差距是非常之大的。因此快取記憶體的容量...