´ÓJava
6¿ªÊ¼£¬ÒªÇó±ê×¼»¯·Ç¶Ñ´æ´¢£¨off-heap£©×÷ΪJavaÄÚ²¿APIµÄÌáÒé¾ÍÒѾÔÚJDKÇ¿»¯Ìá°¸£¨JEP£©Öб»Ìá³ö¡£ÕâÖÖ·½Ê½µÄ´¦ÀíÄÜÁ¦ºÍ¶Ñ´æ´¢£¨on-heap£©Ò»Ñù¸ßЧ£¬²¢ÇÒûÓжѴ洢ʹÓÃÖеÄһЩ¾ÖÏÞÎÊÌâ¡£¶Ñ´æ´¢ÔÚ°ÙÍòÊýÁ¿¼¶Ë²Ê±Ê¹ÓõĶÔÏó/ֵϹ¤×÷µÄÏ൱ºÃ£¬µ«ÊÇÒ»µ©ÄãÊÔͼ´æ´¢Ê®ÒÚÊýÁ¿¼¶µÄ¶ÔÏó/ֵʱ£¬Äã¾ÍÒªÏë°ì·¨È¥±ÜÃâÀ¬»ø»ØÊÕ´øÀ´µÄ³ÖÐøÔö¼ÓµÄÑÓ³Ù¡£²¢ÇÒÓÐʱϵͳ»áÒªÇóͬʱ±£Ö¤´óÁ¿Êý¾Ý´¦ÀíºÍµÍÑÓ³Ù¡£·Ç¶Ñ´æ´¢¾ÍÊÇÓÐÕâÑùÒ»ÖÖÄÜÁ¦£º¶ÀÁ¢¹ÜÀíÄÚ´æ¿Õ¼ä¶ø²»²úÉúÀ¬»ø»ØÊÕѹÁ¦¡£JavaÖйÜÀí¼¯ºÏµÄÁ½¸öÀࡱQueue¡°ºÍ"HashMap"ʹÓÃÆðÀ´Ï൱·½±ã£¬Èç¹ûʹÓÃÕâÁ½¸öÒÑÓнӿÚÔÙ¼ÓÉÏÎÒÃÇ×Ô¼ºµÄÀ¬»ø»ØÊÕ»úÖÆÊµÏÖÆðÀ´Ó¦¸Ã²»ÊǺÜÄÑ¡£ÕâÑù¼ÈÄÜʵÏÖ´óÁ¿Êý¾Ý´æ´¢²¢ÇÒÄÜ´ó´ó¼õÉÙÑÓ³Ù£¬Ïà±È¶øÑÔ£¬ÔÓеĶѴ洢·½Ê½ºÜÈÝÒײúÉúÄÚ´æ²»×ã´íÎó£¬ËæÖ®¾ÍÒªÖØÆô·þÎñÁË¡£
ÕâÆªÎÄÕ½«»áÑо¿ JEPËù´øÀ´µÄÓ°Ï죬½«Ê¹µÃÎÒÃÇ»ñϤÀàËÆÓÚJava HashMapºÍеÄoff-heapµÄÐÔÄÜ¡£¼òÑÔÖ®£¬JEP¿ÉÄܾÍÓС°Ö¸µ¼¡±HashMapÕâ¸ö¿É°®µÄÀϼһïµÄһЩÐÂÌØÐÔµÄħ·¨¡£
JEPËùÊöµÄÌØÐÔ£¬ÔÚOpenJDKµÄ·¢²¼À´¿´£¬Ïà¶ÔÓÚ´«Í³µÄJavaƽ̨ÓÅÏȼ¶×öÁËÐí¶àÖØ´óµÄ¸Ä±ä¡£
1¡¢¹ØÓÚ°²È«ÐÔµÄÖØ¹¹£¬ÕâÒ»sun.misc.UnsafeÉϵÄÓÐÓõIJ¿·Ö£¬±»·ÅÈëÁË
еÄAPI°ü¡£
2¡¢ÌᳫʹÓÃеÄAPI°ü£¬Ö±½ÓÓ°Ïì¸ßÐÔÄܵı¾µØÄÚ´æ²Ù×÷£¨ÔÚoff-heapÉϵı¾µØÄÚ´æ²Ù×÷¶ÔÏóÉÏ£©¡£
3¡¢£¨Í¨¹ýеÄAPI£©Ìṩһ¸ö Íⲿº¯Êý½Ó¿Ú(FFI)ÇÅ Õë¶ÔJavaÖ±½Ó²Ù×÷ϵͳ×ÊÔ´ºÍϵͳµ÷Óá£
4¡¢Ðí¿ÉÁËJavaÔËÐÐʱÄܸ¨Öú Ó²¼þÊÂÎñÐÔÄڴ棨Hardware Tran
sactional Memory£©µÄÌṩÕßÄܰѽ¹µã¼¯ÖÐÔÚÖØÐ´µÍ²¢·¢×Ö½ÚÂëµ½¸ß²¢·¢µÄ
speculatively branched»úÆ÷Âë¡£
5¡¢ÒƳýÁËFUD£¨Ì¹ÂʵĽ²ÕâÊÇÒ»ÖÖ¼¼ÊõÆ«¼û£©£¬ÕâÓëʹÓÃoff-heap±à³Ì²ßÂÔÀ´ÌáÉýJavaµÄÖ´ÐÐÐÔÄÜÓйء£×ܵÄÀ´½²£¬JEPÓм¸µãÊǺÜÇå³þµÄ£¬ÔÚOpenJDKƽ̨ÉÏ£¬Ïà¶ÔÓÚÔø¾µÄ
dark craft, secret society of off-heap practitioners£¬ÏÖÔÚµÄÖ÷Á÷¶Ô¿ª·ÅÊÇÓµ±§µÄ¡£
±¾ÎÄÁ¦Çó£¨ÓÃÆÕ±é¶øÎº͵ķ½Ê½£©ÈÃËùÓжԴ˸ÐÐËȤµÄ Java ¿ª·¢Õß¶¼ÄÜÓÐËùÊÕ»ñ¡£×÷ÕßÏ£Íû¼´Ê¹ÐÂÊÖÒ²ÄܸúÉϱ¾ÎĽÚ×࣬¶ø²»»áÓп´²»¶®µÄ¡°¿Ä¿Ä°í°í¡±£»Òò´Ë²»ÒªÆøÄÙ£¬ÄÍÐÄ×øÏÂÀ´¶ÁÍê°É¡£±¾ÎÄŬÁ¦½éÉÜһЩÀúÊ·±³¾°£¬ÎªÒÔÏÂÎÊÌâÌṩ˼·£º
1.¶Ñ´æ´¢ HashMap µÄÎÊÌâÊÇÔõô²úÉúµÄ?
2.ÔÚ½â¾öÕâ¸öÎÊÌâÉÏÃæ£¬ÓйýÄÄЩ¾Ñé/½Ìѵ£¿
3.ÔÚ¶Ñ´æ´¢ HashMap µÄÓ¦ÓÃÇé¾°ÖУ¬ÓÐÄÄЩÈÔδ½â¾öµÄÎÊÌ⣿
4.Ð嵀 JEP ÌṩµÄ¹¦ÄÜ£¨½« HashMap ·Ç¶Ñ´æ´¢£©ÄÜ´øÀ´ÄÄЩºÃ´¦£¿
5.δÀ´µÄ JEP ÔÚ½â¾öÏÖÔÚÉÐδ½â¾öµÄÎÊÌâÉÏÃæ£¬ÓÐÄÄЩֵµÃÆÚ´ýÖ®´¦£¿
ÄǾÍÈÃÎÒÃÇÒ»Æð¿ªÊ¼Õâ¶ÎÂó̰ɡ£ÖµµÃ¼ÇסµÄÊÇ£¬ÔÚ Java ³öÏÖ֮ǰ£¬hash
±íÊÇʵÏÖÔÚÔÉúÄÚ´æ¶ÑÖеģ¬ÈçC ºÍ C++ ¶¼ÊÇÈç´Ë¡£Ä³ÖÖÒâÒåÉÏÀ´Ëµ£¬ÖØÐÂÒýÈë·Ç¶Ñ´æ´¢ÊÇÖØÐ½éÉÜһЩ¹ÅÀϵļ¼ÇÉ£¬ÕâЩ¼¼Çɵ±´úµÄ¿ª·¢ÕßÍùÍù²»ÔøÁ˽⡣¸÷ÖÖÒâÒåÉÏÀ´Ëµ£¬Õâ¶¼ÊÇÒ»´Î¡°»Øµ½Î´À´¡±µÄÂó̡£ÂÃ;Óä¿ì£¡
OpenJDKµÄ·Ç¶Ñ´æ´¢£¨Off-Heap£©µÄÇ¿»¯Ìá°¸£¨JEP£©
ÒѾÓÐһЩ·Ç¶Ñ´æ´¢£¨Off-Heap£©µÄÇ¿»¯Ìá°¸£¨JEP£©±»Ìá³öÀ´¡£ÏÂÃæÃè»æÁËÒ»¸öÌṩ·Ç¶Ñ´æ´¢£¨Off-Heap£©ÄÚ´æµÄ×îµÍÒªÇó¡£·½°¸ÊÔÍ¼Ìæ´úÏÖÔÚsun.misc.UnsafeËùÌṩµÄÄÚÈÝ£¬²»½öÈç´Ë£¬ÕâЩ·½°¸»¹ÌṩÁËÁíÍâһЩÓÐÓõŦÄÜ¡£
Ìá°¸×ܽ᣺×ܵÄÀ´Ëµ¾ÍÊÇΪsun.misc.Unsafe´´½¨ÁËÒ»¸öÌæ´úµÄ²¿·Ö£¬ÕâÑù¾Í¿ÉÒÔ²»ÓÃÖ±½ÓʹÓÃÄǸö¿â¡£
Ö±½ÓÄ¿±ê£ºÒƳýÐèÒªÖ±½Ó·ÃÎʵÄÄÚ²¿Àà¡£
¼ä½ÓÄ¿±ê£º²»ÌṩÄÇЩ²»ÍƼöµÄ·½·¨£¬Ò²²»ÊµÏÖÄÇЩ²»°²È«£¨Unsafe£©µÄ·½·¨¡£
³É¹¦±ê×¼£ºÌṩһÖÖ·½Ê½È¥ÊµÏÖÄÇÐ©ÖØÒªµÄ¹¦ÄÜ£¬²¢ÇÒ´ïµ½ÓëÄÇЩ²»°²È«£¨Unsafe£©ºÍ FileDispatcherImplµÄ·½Ê½Ò»ÑùµÄÐÔÄÜ¡£
Ìá°¸¶¯»ú£ºµ±Ç°²»°²È«£¨Unsafe£©µÄ·½Ê½¾ÍÒâζמÍÐèÒª¹¹½¨¸ü´óµÄ£¬Ïß³ÌÉϸü°²È«µÄ·Ç¶Ñ´æ´¢£¨Off-Heap£©½á¹¹¡£Õâ¶ÔÓÚ×îС»¯À¬»ø´¦ÀíÆ÷£¨GC£©µÄ¿ªÏúÓÐÒæ¡£Õâ¶ÔÓÚÔÚ½ø³ÌºÍÄÚǶÊý¾Ý¿âÖ®¼äµÄÄÚ´æ¹²Ïí¿ÉÒÔ²»ÓÃCÓïÑÔºÍJNI£¬ÕâÒ²¾ÍÓпÉÄÜÌṩ¸ü¿ì¸ü¶àµÄÒÆ¶¯¼ÆËãÐÔÄÜ¡£µ±Ç°µÄFileDispatcherImpl·½Ê½ÓÃÓÚʵÏÖÈÎÒâ´óСÄÚ´æµÄÓ³Éä¡££¨±ê×¼API±»ÏÞÖÆÔÚ2GBÒÔÄÚ¡££©
ÃèÊö£ºÎª·Ç¶Ñ´æ´¢£¨off-heap£©Ìṩһ¸ö°ü×°Àà(ÀàËÆÓÚ ByteBuffer) £¬»¹ÐèÒªÏÂÃæµÄÔöÇ¿¡£
64λµÄ´óСºÍÆ«ÒÆÁ¿
¶ÔÓÚÒ×ʧ£¨volatile£©µÄºÍÓÐÐòµÄ·ÃÎÊÒÔ¼°±È½ÏºÍ½»»»µÄ²Ù×÷ÉÏÓÐḬ̈߳²È«µÄ½á¹¹¡£
JVMÓÅ»¯±ß½ç¼ì²é£¬¿ª·¢Õß¿ØÖƱ߽ç¼ì²é¡££¨ÔÊÐíÌṩ°²È«ÐÔÉèÖã©
ÓÐÄÜÁ¦ÔÚͬһ»º³åÇøµÄ²»Í¬¼Ç¼¸´ÓÃÒ»·Ý»º³å¡£
ÓÐÄÜÁ¦È¥Ó³ÉäÒ»¸ö·Ç¶Ñ´æ´¢£¨off-heap£©Êý¾Ý½á¹¹£¬Èûº³åÇøÔÚÓÅ»¯¹ýµÄ·½Ê½Ï½øÐб߽ç¼ì²é¡£
±£Áô¹Ø¼ü¹¦ÄÜ
Ö§³ÖÄÚ´æÓ³ÉäÎļþ
Ö§³ÖNIO
Ö§³Ö°Ñд²Ù×÷Ìá½»µ½´ÅÅÌ
ºòÑ¡·½°¸£ºÖ±½ÓʹÓÃsun.misc.Unsafe
²âÊÔ£ºsun.misc.UnsafeºÍÄÚ´æÓ³ÉäÎļþÓÐͬÑùµÄ²âÊÔÐèÇ󡣸½¼ÓµÄ²âÊÔÓ¦¸Ã¹¤×÷ÔÚͬÑùµÄ·½Ê½Ï£¬ÒªÇóչʾµÄḬ̈߳²È«µÄ²Ù×÷ΪAtomicXxxxÀà¡£AtomicXxxxÀàÓ¦¸Ã±»ÖØÐ´²¢ÇÒµ¥¶ÀʹÓù«¹²µÄAPI¡£
·çÏÕ: µ±Ò»Èº¿ª·¢ÕßʹÓÃÁËUnsafeÖ®ºó£¬ËûÃÇ¿ÉÄÜÒ»ÖÂÈÏΪûÓиüÊʺϵÄÌæ´úÆ·¡£ÕâÒâζ×ÅJEPµÄ·¶Î§ºÜ¹ã£¬»òÕß´´½¨ÁËеÄJEP¸²¸ÇÁËUnsafeÖÐµÄÆäËû¹¦ÄÜ¡£
ÆäËûJDK : NIO
¼æÈÝÐÔ: ÌṩÁËÏòºó¼æÈݵĿ⡣Ëü¼æÈÝjava7£¬Èç¹ûÄãÓÐ×ã¹»µÄÐËȤȥÑо¿µÄ»°£¬Ò²ÓпÉÄܼæÈÝjava6¡££¨½ØÖ¹µ½ÕâÆªÎÄÕ£¬Java
7Êǵ±Ç°µÄ°æ±¾£©¡£
°²È«ÐÔ: ÔÚÀíÏëÇé¿öÏ£¬°²È«µÄ·çÏÕÐÔ²»Äܳ¬¹ýByteBufferÌ«¶à¡£
ÐÔÄܺͿÉÀ©Õ¹ÐÔ: ÓÅ»¯±ß½ç¼ì²éÊÇÀ§Äѵġ£ÎªÁËÌí¼Ó¸ü¶àµÄÆÕͨ²Ù×÷£¬ÔòÐèÒª°Ñ¹¦ÄÜÌí¼Óµ½ÐµĻº³åÇø£¬ÒÔ¼õÉÙ¿ªÏú£¬ÀýÈç¶ÁдUTF¡£
HashMap¼òÊ·
¡°Hash Code¡±Õâ¸ö¸ÅÄîµÚÒ»´Î³öÏÖÊÇÔÚ1953Äê1Ôµġ¶Computing literature¡·ÖУ¬H.
P. Luhn (1896-1964) ÔÚһƪ IBM µÄÄÚ²¿±¸Íü¼ÖÐÌá³öÁËÕâ¸öÊõÓï¡£µ±Ê± Luhn ÊÇÒª½â¾öÕâ¸öÎÊÌ⣺¡°¸ø³ö×é³ÉÒ»±¾½Ì¿ÆÊéµÄһϵÁе¥´Ê£¬ÒªµÃ³ö
100% ÍêÕûµÄ£¨µ¥´Ê£¬³öÏÖÒ³Â뼯£©¶ÔÓ¦¹ØÏµ£¬×îºÃµÄËã·¨ºÍÊý¾Ý½á¹¹ÊÇʲô£¿¡±
H.P. Luhn (1896-1964)
Luhn дµÀ£¬ ¡°hashcode¡± ÊÇ»ù±¾µÄÔËËã·û¡£
Luhn дµÀ£¬ ¡°Associative Array¡± ÊÇ»ù±¾µÄÔËËãÊý¡£
ÓÉ´Ë£¬ ¡®HashMap¡¯ (Ò²³ÆÎª HashTable) ¾ÍÕâÑù²úÉúÁË¡£
×¢: HashMap ÊÇÓÉ 1896 Äê³öÉúµÄ¼ÆËã»ú¿ÆÑ§¼ÒÌá³öÀ´µÄ¡£HashMap ¿ÉÊǸöÀÏ ¼Ò»ïÀ²!
´Ó HashMap µÄµ®Éú½²µ½ËüµÄÔçÆÚÓ¦Óó¡¾°£¬ÎÒÃÇ´Ó1950Äê´úÌøµ½1970Äê´ú
Niklaus Wirth ÔÚËû1976Äê±àдµÄ¾µäÖø×÷¡¶Ëã·¨ + Êý¾Ý½á¹¹ = ³ÌÐò¡·ÖУ¬Ì¸µ½¶ÔÓÚËùÓеijÌÐò£¬¶¼¿ÉÒÔ½«¡°Ëã·¨¡±ÊÓΪ»ù±¾µÄÔËËã·û£¬½«¡°Êý¾Ý½á¹¹¡±ÊÓΪ»ù±¾µÄÔËËã¡°Êý¡±¡£
´ÓÄÇʱÆð£¬Êý¾Ý½á¹¹(HashMap£¬HeapµÈ)·¢Õ¹»ºÂý¡£1987ÄêÓÐÒ»¸öÖØ´óÍ»ÆÆ£¬ Tarjan Ìá³öÁ˷dz£ÖøÃûµÄ
F-Heap £»µ«³ý´ËÖ®Í⣬·¦Éƿɳ¡£ÒªÖªµÀ£¬HashMap ÊÇ1953ÄêµÚÒ»´ÎÌá³öµÄ£¬ÒѾ¹ýÈ¥60ÓàÄêÀ²£¡
Óë´Ëͬʱ£¬Ëã·¨·½Ãæ (Karmakar 1984, NegaMax 1989, AKS Primality
2002, Map-Reduce 2006, Grover¡¯s Quantum search - 2011)
Ôò½øÕ¹Ñ¸ËÙ£¬Îª¼ÆËãµÄ»ù´¡½¨Éè´øÀ´ÁËոеġ¢Ç¿´óµÄÔËËã·û¡£
È»¶ø£¬ÏÖÔÚµ½ÁË2014£¬Ò²ÐíÓÖÂÖµ½Êý¾Ý½á¹¹À´È¡µÃÖØ´ó½øÕ¹ÁË¡£´Ó OpenJDK ƽ̨À´¿´£¬ ·Ç¶Ñ HashMap
¾ÍÊÇÒ»¸öÕýÔÚ·¢Õ¹µÄÊý¾Ý½á¹¹¡£
HashMap µÄÀúÊ·¾Í½éÉܵ½Õâ¡£ÏÂÃæÎÒÃÇÀ´Ì½Ë÷½ñÌìµÄ HashMap °É¡£¾ßÌåÀ´Ëµ£¬ÎÒÃÇÏÈÀ´¿´Ò»¿´Õâ¸öÀϼһïÔÚ
Java ÖÐÏÖ´æµÄ 3 ÖÖʵÏÖ¡£
N. Wirth 1934-
java.util.HashMap (·ÇḬ̈߳²È«)
¶ÔÓÚÈκÎÕæÕýµÄ¶àÏ̲߳¢·¢ÓÃÀý£¬Ëü»áÁ¢¼´Ê§°Ü£¬¶øÇÒÊÇÿ´Î¶¼»áʧ°Ü¡£ËùÓÐÓõ½ËüµÄ´úÂë±ØÐëʹÓà Java ÄÚ´æÄ£ÐÍ(JMM)µÄÄÚ´æÆÁÕÏ(memory
barrier)²ßÂÔ(Èç synchronized »ò volatile) À´±£Ö¤Ë³ÐòÖ´ÐС£
Ò»¸ö¼òµ¥µÄʧ°ÜÑùÀýÈçÏ£º
- synchronized µÄдÈë
- û¼Ó synchronized µÄ¶ÁÈ¡
- ÕæÕý²¢·¢ (2 ¸ö CPU/L1)
ÎÒÃÇÀ´¿´¿´ÎªÊ²Ã´»áʧ°Ü...
¼ÙÉèÏß³Ì1дÈë HashMap£¬ÄÇôËü×ö³öµÄ¸Ä¶¯Ö»»á±£´æÔÚ CPU 1µÄ1¼¶»º´æÖС£È»ºóÏß³Ì2£¬ÔÚ¼¸ÃëÖÓºó¿ªÊ¼ÔÚ
CPU 2ÉÏÔËÐУ»Ëü¶ÁÈ¡ HashMap£¬ÊÇ´Ó CPU 2µÄ1¼¶»º´æÖжÁ³öÀ´µÄ¡ª¡ªËü¿´²»µ½Ïß³Ì1×ö³öµÄ¸Ä¶¯£¬ÒòΪÔÚ¶ÁºÍдµÄÏß³ÌÖж¼Ã»ÓжÁ¡¢Ð´¼äµÄÄÚ´æÆÁÕÏ£¬ËäÈ»
Java ÄÚ´æÄ£ÐÍÒªÇóÏ̹߳²Ïí HashMap µÄÇéÐÎϱØÐëÒªÓС£¼´Ê¹Ïß³Ì1µÄд²Ù×÷¼ÓÁË synchronize
Ò²»áʧ°Ü£¬ÕâÑùËäÈ»ÄܰÑËü×ö³öµÄ¸Ä¶¯Ð´Èëµ½Ö÷ÄÚ´æÖУ¬µ«Ïß³Ì2ÈÔÈ»¿´²»µ½ÕâЩ¸Ä¶¯£¬ÒòΪÏß³Ì2Ö»»á´Ó CPU
2µÄ1¼¶»º´æÖжÁÈ¡¡£ËùÒÔÔÚд²Ù×÷ÉÏ¼Ó synchronized Ö»ÄܱÜÃâд²Ù×÷µÄ³åÍ»¡£Òª¶ÔÓÚËùÓеÄÏ̶߳¼Ìí¼Ó±ØÒªµÄÄÚ´æÆÁÕÏ£¬Äã±ØÐëÒ²Òª
synchronize ¶Á²Ù×÷¡£
thrSafeHM = Collections.synchronizedMap(hm)
; £¨´ÖÁ£¶ÈËø¶¨£©
ʹÓá°Í¬²½¡±Ê±ÊµÏÖ¸ßÐÔÄÜÒªÇóµÍ¾ºÕùÂÊ¡£ÕâÊǺܳ£¼ûµÄ£¬¶øÇÒÔںܶàÇé¿öÏÂÕâ²¢²»ÏñÌýÆðÀ´ÄÇô»µ¡£È»¶ø£¬Ò»µ©ÄãÒýÈëÈκξºÕù£¨¶à¸öÏß³ÌÊÔͼͬʱ²Ù×÷ͬһ¼¯ºÏ£©£¬ÐÔÄܾͻáÊܵ½Ó°Ïì¡£ÔÚ×µÄÇé¿öÏ£¬Èç¾ßÓкܸߵÄËøÕùÓã¬Äã¿ÉÄÜ»áµÃµ½¶à¸öÏ̱߳ȵ¥¸öỊ̈߳¨²Ù×÷ûÓÐËø¶¨»òÈκÎÖÖÀàµÄÕù¶á£©µÄÐÔÄܱíÏÖ¸ü²îµÄ½áÂÛ¡£
Collections.synchronizedMap() ·µ»ØÒ»¸ö MT-Safe HashMap.
ÕâÊÇÒ»¸öͨ¹ý´ÖÁ£¶ÈµÄËøÀ´ÊµÏÖËùÓйؼü²¿·ÖµÄmutate()ºÍaccess()²Ù×÷£¬ÕâÑù¿ÉÒÔÈöà¸öÏ̲߳Ù×÷Õû¸öMap¡£Õâ¸ö½á¹ûÔÚZero
MT-concurrencyÖУ¬Òâζ×ÅÒ»¸öʱ¿Ì½öÓÐÒ»¸öÏ߳̿ÉÒÔ·ÃÎÊ¡£ÁíÒ»¸öºó¹û¾ÍÊÇ×÷Ϊ¸ßËøÕùÓã¨High
Lock Contention£©µÄ´ÖÁ£¶ÈËø£¬Ëø×¡µÄ;¾¶ÊÇÒ»Öַdz£²»ÊÜ»¶ÓµÄÒÑÖªÌõ¼þ¡£¹ØÓÚ¸ßËøÕùÓã¨High
Lock Contention£©£¨Çë¿´ÔÚ×ó±ßµÄͼƬ£¬N¸öÏß³ÌÕùÓÃÒ»¸öËø£¬µ«ÊÇÆÈÓÚ×èÈûÖ»ºÃµÈ´ý×Å£¬ËøÒѾ¸øÁËÕýÔÚÔËÐеÄỊ̈߳©¡£
ÐÒºÃÕâÊÇÍêȫͬ²½µÄ£¬²»»áÕæÕýµÄͬ²½£¬¸ôÀ루isolation£©=ÐòÁл¯£¨SERIALIZABLE£©£¨×ÜÌåÉÏÕâÊÇÁîÈËʧÍûµÄ£©HashMapÏÝÚ壬ÎÒÃÇÆÚ´ýµÄOpenJDK·Ç¶Ñ´æ´¢£¨off-heap£©JEPÒѾÓÐÒ»¸ö
ÖµµÃÍÆ¼öµÄÆÚ´ý£ºÓ²¼þÊÂÎñÐÔÄڴ棨Hardware Transactional Memory (HTM)£©¡£¹ØÓÚHTM£¬´ÖÁ£¶ÈµÄͬ²½Ð´²Ù×÷ÔÚJavaÖн«»áÔÙÒ»´Î±äµÃºÜ¿á£¡¾ÍÈÃHTMͨ¹ý´úÂëÉϵÄÁã²¢·¢ºÍÔÚÓ²¼þµÄÁã²¢·¢À´°ïÖúÎÒÃÇ£¬ÊµÏÖÕæÕýµÄ²¢·¢²¢ÇÒ100%µÄ¶àḬ̈߳²È«¡£ÕâºÜ¿á£¬¶Ô°É£¿
java.util.concurrent.ConcurrentHashMap
(Ḭ̈߳²È«¡¢ÖÇÄÜËø£¬µ«²¢·ÇÍêÃÀ)
ÔÚjdk1.5µÄºËÐÄAPIÖУ¬ÖÕÓÚ·¢²¼ÁËjava³ÌÐòÔ±ÃÎÃÂÒÔÇóµÄjava.util.concurrent.ConcurrentHashMap¡£ËäÈ»ConcurrentHashMap²»ÄÜ¹ã·ºÌæ´úHashMap£¨ConcurrentHashMapÏûºÄ¸ü¶àµÄ×ÊÔ´£¬Ôڵ;ºÕùÌõ¼þÏ¿ÉÄܲ»Ì«Êʺϡ££©£¬µ«ÊÇËü½â¾öÁËÆäËüÀàÐ͵ÄHashMap½â¾ö²»Á˵ÄÎÊÌ⣺Ìṩ¼ÈÓÐÕæÕýµÄ¶àḬ̈߳²È«£¬ÓÖÓÐÕæÕýµÄ¶àÏ̲߳¢·¢µÄÄÜÁ¦¡£ÈÃÎÒÃǻһ·ù»À´×¼È·µØÃèÊöConcurrentHashMapΪʲô£¨ÔÎÄÊÇhow£©ÕâôÓÐÓõģ¨ÓÐЧ£¬ÓÐ×÷Ó㬲»ÖªµÀÔõô·ÒëºÃÁË¡£ÔÎÄ£ºhelpful£©¡£
1.·ÖÀëËø
2.ÿ¸ö¶ÀÁ¢µÄHashMap×Ó¼¯¶ÔÓ¦Ò»¸öËø£ºN¸öhashͰ£¨×Ó¼¯£©¶ÔÓ¦N¶Î(Segments)Ëø¡££¨ÔÚͼƬÓұߣ¬¶Î(Segments)
= 3
3.ÔÚÉè¼Æ³ö½«Ò»¸ö¸ß¾ºÕùµÄËø·Ö½â³É¶à¸ö²»Ó°ÏìÊý¾ÝÍêÕûÐÔµÄËøÊ±£¬·ÖÀëËøÊǷdz£ÓÐÓõġ£
4.¸üºÃµÄ²¢·¢£¬ÔÚ´¦Àí"Ïȼì²éÅжÏ״̬£¬ÔÙ²Ù×÷"£¨"check-then-act"£©µÄ¾ºÌ¬Ìõ¼þÎÊÌâʱ£¬concurrentHashMapÊÇÒ»¸ö²»ÐèҪͬ²½µÄ½â¾ö·½°¸¡£
5.ÎÊÌ⣺ÄãÈçºÎͬʱ±£»¤Õû¸ö¼¯ºÏ(collections)? »ñÈ¡ËùÓеÄËø(µÝ¹éµØ)?
ÏÖÔÚÄã¿ÉÄÜÒªÎÊÁË£ºËæ×ÅConcurrentHashMapºÍjava.util.concurrent°üµÄ·¢²¼£¬javaÊÇÒ»¸ö¸ßÐÔÄܼÆËãÉçÇø£¨High
Performance Computing community£©Äܹ»ÔÚÉÏÃæ´´½¨½â¾ö·½°¸À´½â¾öËûÃÇÎÊÌâµÄÖÕ¼«±à³Ìƽ̨Âð£¿
²»ÐÒµÄÊÇ£¬ºÜÏÖʵµÄÒ»¸ö»Ø´ð»¹ÊÇ¡°»¹Ã»ÄØ¡±¡£ÕæµÄ£¬ÄÇô»¹´æÔÚ×ÅʲôÎÊÌâÄØ£¿
ConcurrentHashMap´æÔÚ׏æÄ£ÎÊÌâºÍ±£´æÖмä̬¶ÔÏó£¨medium-lived objects£©ÎÊÌâ¡£Èç¹ûÄãÓÐһС²¿·ÖʹÓÃconcurrentHashMapµÄ¹Ø¼üµÄ¼¯ºÏ¶ÔÏ󣬺ܿÉÄÜÓÐЩ»áºÜ´ó¡£ÔÚijЩÇé¿öÏ£¬ÔÚÕâЩ¼¯ºÏÖдæÔÚ×Å´óÁ¿µÄÖмä̬¶ÔÏó(medium-lived
objects)¡£ÕâЩÖмä̬¶ÔÏó(medium-lived objects)¹±Ï×Á˴󲿷ֵÄGC´ÎÊý£¨Ê±¼ä,GC
pause times£©£¬ËûÃǵÄÏûºÄÓпÉÄÜÊǶÌÔݶÔÏó£¨short-lived objects£©µÄ20±¶¡£³¤Ê±¼ä´æ»î¶ÔÏó(Long-lived
objects)ÍùÍùÍ£ÁôÔÚÖÕÉíÇø(tenured space)£¬¶ÌÔݶÔÏó(short-lived objects)ÔÚyoungÇøËÀÍö£¬µ«ÊÇÖмä̬¶ÔÏó(medium-lived
objects)»á¸´ÖƵ½ËùÓеĴæ»î¿Õ¼ä£¬²¢ÔÚÖÕÉíÇø(trenured space)ËÀÍö£¬Öмä̬¶ÔÏó(medium-lived
objects)µ½´¦¿½±´²¢ÔÚ×îºó±»ÇåÀí²úÉúµÄÏûºÄÊ®·Ö¾Þ´ó¡£×îÀíÏëµÄÊÇÄãÄÜÓÐÒ»¸öûÓÐGCÓ°ÏìµÄ´¢´æÊý¾ÝµÄ¼¯ºÏ¡£
·ÒëÖеÄmedium-lived objects, short-lived objects,Long-lived
objects,tenured space,young space
ÕâÀà´Ê£¬¶ÔÓ¦µÄÊÇjava GCÖеĴÊÓ¶ÔÓ¦µÄÖÐÎÄ·ÒëÊÇɶÎҼDz»×¡ÁË£¬Çë±à¼»òÆäËûÅóÓÑÐÞÕý¡£
ConcurrentHashMapÔªËØÔÚÔËÐÐʱ´æÔÚJava VM¶ÑÀï¡£ÒòΪCHMÊǶѴ洢£¬Ëü¶ÔÓÚ Stop-the-World
(STW) ÓÐ×ÅÏÔÖøµÄ¹±Ï×£¬¼´Ê¹²»ÊÇ×îÏÔÖøµÄ¡£µ±STWµÄGCʼþ·¢Éú£¬ËùÓÐÓ¦ÓóÌÐòµÄ´¦Àí¶¼ÒªÈÌÊÜ×ųôÃûÕÑÖøµÄ¡°½ô¼±ÔÝÍ£¡±µÄÑÓʱ¡£ÕâÖÖÑÓʱ£¬ÊÇÓÉCHM£¨ÒÔ¼°ËüµÄËùÓÐÔªËØ£©·ÅÔÚ¶Ñ´æ´¢ÖÐÒýÆðµÄ£¬ÊÇÒ»¸ö²ÒÍ´µÄ¾Àú¡£ÕâÊÇÒ»¸ö¾ÑéÒ²ÊÇÒ»¸ö¸ßÐÔÄܼÆËãËù²»ÄÜÈÌÊܵÄÎÊÌâ¡£
ÔÚ¸ßÐÔÄܼÆËã×éÖ¯ÍêÈ«½ÓÊÜJava֮ǰ£¬±ØÐëÒªÓиö½â¾ö·½°¸À´Ñ±·þÕâ¸ö¶Ñ´æ´¢µÄGC¹ÖÊÞ¡£
½â¾ö·½°¸´Ó¾«Éñ²ãÃæÉϽ²·Ç³£¼òµ¥£º¾ÍÊǰÑCHM·Åµ½·Ç¶Ñ´æ´¢ÖС£
¶øÕâ¸ö½â¾ö·½°¸£¬OpenJDKµÄ·Ç¶Ñ´æ´¢JEPµ±È»ÊÇÖ§³ÖµÄ¡£
ÔÚÎÒÃÇÉîÈëչʾ·Ç¶Ñ´æ´¢ÈçºÎ¸úHashMapÏàËÆÖ®Ç°£¬ÎÒÃÇÏÈÍêÕûµØÁ˽â¶Ñ´æ´¢µÄ²»ÓѺõÄϸ½Ú¡£
¶Ñ¼òÊ·
JavaµÄ¶Ñ´æ´¢ÊÇÓɲÙ×÷ϵͳ·ÖÅ䏸JVMµÄ¡£ËùÓеÄJava¶ÔÏó¶¼Í¨¹ý¶Ñ´æ´¢JVMλÖÃ/±êʶÀ´ÒýÓá£ÄãÔÚ¶Ñ´æ´¢ÉÏÔËÐÐÒ»¸ö¶ÔÏ󱨶¨»áÒýÓÃÁ½¸ö¶ÑÇøÓòÆäÖÐÖ®Ò»¡£ÕâÐ©ÇøÓò¸üÈ·ÇÐÀ´ËµÎªÒ»´ú¡£Ã÷È·À´·ÖΪ£º(1)ÄêÇá´ú
(ÓÉEDENºÍÁ½¸öSURVIVOR×Ó¿Õ¼ä×é³É) ºÍ (2) ÄêÀÏ´ú¡£ £¨×¢£ºOracleÈÕǰÐû²¼£¬³Ö¾Ã´úÔÚJDK7ÖпªÊ¼Öð²½ÌÔÌ£¬¶øÔÚJDK8½«»áÍêÈ«±»ÌÔÌ£©¡£ËùÓеĴú¶¼ÔâÊÜÁË¿Éŵġ°È«²¿Í£Ö¹(Stop-the-World)¡±ÍêÈ«À¬»ø»ØÊÕʼþ£¬³ý·ÇÄãʹÓá°ÉÙÁ¿ÔÝÍ£¡±»ØÊÕ»úÖÆÀýÈçAzulµÄZing.
ÔÚÀ¬»ø»ØÊÕµÄÊÀ½çÀ²Ù×÷ÊÇÓÉ¡°»ØÊÕ»úÖÆ¡±Ö´Ðеģ¬ÕâЩ»ØÊÕÆ÷µÄ²Ù×÷¶ÔÏóÊǶѵġ°´ú¡±£¨ÒÔ¼°×ӿռ䣩µÄÄ¿±ê¡£»ØÊÕÆ÷ÔÚ¶ÑÕ»/¿Õ¼äÄ¿±êÖнøÐвÙ×÷¡£ÍêÕûµÄÀ¬»ø»ØÊÕÊÇÈçºÎ¹¤×÷µÄÄÚ²¿Ï¸½ÚÊÇËü×Ô¼º±¾ÉíÒ»¸ö£¨·Ç³£´óµÄ£©Ö÷Ì⣬ÓÐרÃŵÄÎÄÕ»áÌáµ½¡£
ÏÖÔÚÖªµÀÒ»µã£ºÈç¹ûÈκλØÊÕÆ÷(ÈκÎÀàÐ͵Ä)²Ù×÷ÈκÎÒ»´úµÄ¶Ñ¿Õ¼ä¶¼»áÔì³É¡°Í£Ö¹Ò»ÇÐ(Stop The World)¡±µÄʼþ¡ª¡ªÕâÊÇÒ»¸ö·Ç³£ÑÏÖØµÄÎÊÌâ¡£
ÕâÊÇÒ»¸öÎÊÌâ±ØÐëµÃÓиö½â¾ö·½°¸¡£
ÕâÊÇÒ»¸öÎÊÌâÖ»ÓзǶѴ洢JEP¿ÉÒÔ½â¾ö¡£
ÈÃÎÒÃÇ×Ðϸ¿´¿´¡£
Java¶Ñ²¼¾Ö: ²é¿´ËüµÄÀú´ú
À¬»ø»ØÊÕʹµÃ±à³Ì±äµÃ¸ü¼ÓÈÝÒ×£¬µ«ÊÇÔÚSLAÄ¿±êµÄÊÀ½çÀÎÞÂÛÊÇÊéÃæµÄ»¹ÊǰµÊ¾µÄ£¨ÎÒµÄJava AppletÔÝÍ£30Ãë²»ÊÇÒ»ÖÖÑ¡Ôñ£©£¬Í£Ö¹Ò»ÇÐ(Stop-The-World)ʱ¼äÔÝÍ£¶ÔÓÚÐí¶àJava¿ª·¢ÈËÔ±À´ËµÊÇÒ»¸öºÜÍ·ÌÛµÄÎÊÌ⣬°ÚÔÚËûÃÇÃæÇ°µÄÖ»ÓÐÐÔÄÜÎÊÌ⡣˳±ãÌáһϣ¬»¹ÓÐÐí¶àÆäËûÐÔÄÜÎÊÌâÐèÒª´¦Àí£¬Ö»ÓÐÔÚSTW²»ÔÙÊÇÎÊÌâµÄʱºò¡£
ʹÓÃoff-heap´æ´¢µÄºÃ´¦£¬¾ÍÊÇÖеÈÊÙÃü¶ÔÏóµÄÊýÁ¿¿ÉÒÔ´ó·ù¶ÈϽµ¡£ËüÉõÖÁÒ²¿ÉÒÔ½µµÍ¶ÌÊÙÃü¶ÔÏóµÄÊýÁ¿¡£¶ÔÓÚ¸ßÆµ½»Ò×ϵͳ£¬ËüÒ»Ìì¿ÉÒÔ´´½¨µÄÀ¬»ø±ÈÄãµÄEden¿Õ¼ä´óС»¹ÒªÐ¡£¬ÕâÒâζ×ÅÄã¿ÉÒÔÔËÐÐÒ»ÕûÌì¶ø²»ÐèÒªÒ»¸ö¼òµ¥µÄ»ØÊÕ¡£Ò»µ©ÄãÓзdz£µÍµÄÄÚ´æÑ¹Á¦£¬ÒÔ¼°²¿·Ö¶ÔÏóÒѾµ½´ïÄêÀÏ´ú(tenured)¿Õ¼ä£¬µ÷ÕûÄãµÄGC¾Í»á±äµÃºÜËöË顣ͨ³£ÄãÉõÖÁ²»ÐèÒªÉèÖÃGCµÄ²ÎÊý£¨³ý·ÇÏ£ÍûÔö¼ÓedenÇøµÄ´óС£©¡£
ͨ¹ýÒÆ¶¯¶ÔÏ󵽷ǶѴ洢£¬JavaÓ¦ÓóÌÐòÍùÍùÄܹ»Êջؼà¹Ü¿ØÖÆ×Ô¼ºµÄÃüÔË£¬Âú×ãSLAÐÔÄܵįÚÍûºÍÒåÎñ¡£
µÈһϣ¬¸Õ¸Õ×îºóÒ»¾ä˵ɶÀ´×Å£¿
×¢Ò⣺ËùÓг˿ͣ¬ÇëÊÕÆðÄãµÄÍÐÅ̲¢×øÖ±À´¡£OpenJDK·Ç¶Ñ´æ´¢JEPµÄÖÐÑë×â»§ÊÇÒ»¸ö·Ç³£ÖµµÃÖØ¸´µÄÊÂÇé¡£
ÒÆ¶¯»ØÊÕ(ÈçHashMap)µ½·Ç¶Ñ´æ´¢£¬JavaÓ¦ÓóÌÐò¾³£Äܹ»ÇëÇóËûÃǵĻØÊÕ£¨²»ÔÙÒÀÀµÓÚSTWµÄGC»úÖÆÖеġ°½ô¼±ÔÝÍ£¡±Ê¼þ£©È¥¿ØÖÆËûÃÇ×ÔÉíµÄÃüÔË£¬Âú×ãSLAÐÔÄܵįÚÍûºÍÒåÎñ¡£
ÕâÊÇÒ»¸öºÜʵÓõÄÑ¡Ôñ£¬ÔÚJavaµÄ¸ßƵÂʽ»Ò×ϵͳÖÐÒѾÔÚʹÓá£
Õâ¸öÑ¡ÔñÒ²³¹µ×ÐèÒªJava±£³Ö×ŶԸßÐÔÄܼÆËãÔ½À´Ô½¶àµÄÎüÒýÁ¦¡£
¶Ñ´æ´¢µÄÓÅÊÆ
³£¼ûµÄ£¬Ð´ÆÕͨµÄJava´úÂë¡£ËùÓÐÓоÑéµÄJava¿ª·¢ÈËÔ±¶¼¿ÉÒÔ×öµ½¡£
·ÃÎÊÄÚ´æµÄ°²È«ÐÔÎÊÌâ¡£
×Ô¶¯µÄGC·þÎñ¡ª¡ªÎÞÐè×ÔÉí¹ÜÀíµÄmalloc()/free()²Ù×÷¡£
ÍêÕûµÄ Java Lock APIºÍJMMÏà½áºÏ¡£
Ìí¼ÓÎÞÐòÁл¯/¸´ÖÆÊý¾Ýµ½Ò»¸ö½á¹¹ÖÐÈ¥¡£
·Ç¶Ñ´æ´¢µÄÓÅÊÆ
¿ØÖÆ"Í£Ö¹Ò»ÇÐ(Stop the World)"µÄGCʼþµ½Äã±È½ÏÂúÒâµÄ²ã´Î¡£
¿ÉÒÔ³¬Ô½ÔÚ¹æÄ£ÉϵĶѴ洢½á¹¹£¨µ±Ê¹ÓöѴ洢µÄʱºò»á±äµÃºÜ¸ß£©
¿ÉÒÔ×÷Ϊһ¸ö±¾µØµÄIPC´«Ê䣨ÎÞÐèjava.net.SocketµÄIP»ØËÍ£©
·ÖÅäÆ÷µÄ×¢ÒâÊÂÏ
NIO DirectByteBufferµ½/dev/shm (tmpfs)µÄmap?
»òÕßÖ±½Ósun.misc.Unsafe.malloc()?
HashMapµÄ½éÉÜ ¡ ÓÐʲôеÄÎÊÌâʹµÃÕâ¸ö¡°ÀϼһµÃÒÔ½â¾öÄØ(ͨ¹ýʹÓ÷ǶѴ洢)?
½éÉÜ OpenHFT HugeCollections (SHM)
µ½µ×ÄÄÀï²ÅÊÇ¡°·Ç¶Ñ´æ´¢¡±£¿
ÏÂͼ½éÉÜÁËÁ½¸öʹÓÃShardHashMap(SHM)×÷Ϊ½ø³Ì¼äͨÐÅ(IPC)µÄJava VM¹ý³Ì(PID1ºÍPID2)¡£Í¼±íµ×²¿µÄˮƽÖá´ú±íµÄÊÇÍêÈ«SHM²Ù×÷ϵͳµÄËùÔÚÓò¡£µ±OpenHFT¶ÔÏó±»²Ù×÷ʱ£¬Ëü¾Í»áÔÚ²Ù×÷ϵͳÖÐÎïÀíÄÚ´æµÄÓû§µØÖ·¿Õ¼ä»òÕßÄں˵ØÖ·¿Õ¼äµÄij´¦¡£ÍùÉîÒ»²ã˼¿¼£¬ÎÒÃÇÖªµÀËûÃÇÒÔ¡°¹ØÓÚ½ø³Ì¡±µÄ¾Ö²¿¿ªÊ¼×ÅÊÖ¡£´ÓLinux²Ù×÷ϵͳÀ´¿´£¬JVMÊÇÒ»¸öa.out
£¨Í¨¹ýµ÷Óà gcc³ÊÏֵģ©¡£µ±a.outÔÚÔËÐеÄʱºò»áÓÐÒ»¸öPID¡£Ò»¸ö PIDµÄ a.out (ÔÚÔËÐÐʱ)°üº¬ÒÔÏÂÈý¸ö·½Ãæ:
Îĵµ£¨µÍµØÖ·¡¡Ö´ÐдúÂëµÄµØ·½£©
Êý¾Ý£¨Í¨¹ýsbrk(2)´ÓµÍµØÖ·Éý¼¶µ½¸ßµØÖ·À´Õƹܣ©
Õ»£¨´Ó¸ßµØÖ·µ½µÍµØÖ·À´Õƹܣ©
ÕâÊÇPIDÔÚ²Ù×÷ϵͳÖеıíÏÖÐÎʽ¡£Ò²¾ÍÊÇ˵£¬PIDÊÇÒ»¸öÖ´ÐеÄJVM£¬JVMÓÐËü×Ô¼º²Ù×÷¶ÔÏóDZÔڵľֲ¿ÐÔ¡£
´ÓJVMÀ´¿´£¬²Ù×÷¶ÔÏó×÷ΪOn-PID-on-heap(Ò»°ãµÄJava)»òÕßOn-PID-off-heap(ͨ¹ýUnsafe»òÕßNIOµ½Linux
mmap(2)µÄÇÅÁº)¡£ÎÞÂÛÔÚOn-PID-on-heap»¹ÊÇÔÚOn-PID-off-heap£¬ËùÓеIJÙ×÷¶ÔÏóÈÔÈ»´æ»îÔÚÓû§µÄµØÖ·¿Õ¼ä¡£ÔÚC/C++ÖУ¬API(²Ù×÷ϵͳµ÷ÓõÄ)ÌṩÁËÔÊÐíC++²Ù×÷¶ÔÏóÓÐ
Off-PID-off-heapµÄµØ·½£¬ÕâЩ²Ù×÷¶ÔÏ󶼼ĴæÔÚÄں˵ØÖ·¿Õ¼äÄÚ¡£
¸ù¾ÝÉÏÃæÕâ¸öͼ£¬·ÖΪÒÔÏÂÁù¸ö·½Ã棺
#1. ΪÁ˸üºÃµØÂäʵͼÖеÄÁ÷³Ì£¬ÎÒÃÇ¿ÉÒÔÏÈ×ñ´ÓJavaBeanµÄ¹æ·¶£¬°ÑPID 1¶¨Òå³ÉBondVOInterface¡£ÎÒÃÇÏëÒªÖ¤Ã÷£¨ÒÔϵıàºÅÊÇÉÏͼÖÐÁ÷³ÌµÄ±àºÅ£©ÈçºÎ²Ù×÷
Map<String,BondVOInterface> £¬²¢°Ñ·Ç¶Ñ´æ´¢µÄÓÅÊÆ±ê×¢ÆðÀ´¡£
À´×ÔGitHub:
public interface BondVOInterface {
02
/* add support for entry based locking */
03
void busyLockEntry() throws InterruptedException;
04
void unlockEntry();
05
long getIssueDate();
06
void setIssueDate(long issueDate); /* time in millis */
07
long getMaturityDate();
08
void setMaturityDate(long maturityDate); /* time in millis */
09
double getCoupon();
10
void setCoupon(double coupon);
11
// OpenHFT Off-Heap array[ ] processing notice ¡®At¡¯ suffix
12
void setMarketPxIntraDayHistoryAt(@MaxSize(7) int tradingDayHour, MarketPx mPx);
13
/* 7 Hours in the Trading Day:
14
* index_0 = 9.30am,
15
* index_1 = 10.30am,
16
¡,
17
* index_6 = 4.30pm
18
*/
19
MarketPx getMarketPxIntraDayHistoryAt(int tradingDayHour);
20
/* nested interface - empowering an Off-Heap hierarchical ¡°TIER of prices¡±
21
as array[ ] value */
22
interface MarketPx {
23
double getCallPx();
24
void setCallPx(double px);
25
double getParPx();
26
void setParPx(double px);
27
double getMaturityPx();
28
void setMaturityPx(double px);
29
double getBidPx();
30
void setBidPx(double px);
31
double getAskPx();
32
void setAskPx(double px);
33
String getSymbol();
34
void setSymbol(String symbol);
35
}
36
}
|
PID 1£¨ÔÚÉÏͼËùʾµÄ step#1£¬Ê¹ÓÃÁËInterface£©µ÷ÓÃOpenHFTµÄ SharedHashMap¹¤³§À࣬ÈçÏÂËùʾ£º
SharedHashMap<String, BondVOInterface> shm = new SharedHashMapBuilder() 02 .generatedValueType(true) 03 .entrySize(512) 04 .create( 05 new File("/dev/shm/myBondPortfolioSHM"), 06 String.class, 07 BondVOInterface.class 08 ); 09 BondVOInterface bondVO = DataValueClasses.newDirectReference(BondVOInterface.class); 10 shm.acquireUsing("369604103", bondVO); 11 bondVO.setIssueDate(parseYYYYMMDD("20130915")); 12 bondVO.setMaturityDate(parseYYYYMMDD( "20140915")); 13 bondVO.setCoupon(5.0 / 100); // 5.0% 14 BondVOInterface.MarketPx mpx930 = bondVO.getMarketPxIntraDayHistoryAt(0); 15 mpx930.setAskPx(109.2); 16 mpx930.setBidPx(106.9); 17 BondVOInterface.MarketPx mpx1030 = bondVO.getMarketPxIntraDayHistoryAt(1); 18 mpx1030.setAskPx(109.7); 19 mpx1030.setBidPx(107.6);
|
ÏÖÔÚ£¬OpenHFT´Ó¶Ñ´æ´¢µ½·Ç¶Ñ´æ´¢µÄħ·¨Òª¿ªÊ¼ÁË£¡¿´×ÐϸÁË¡¡ä¯ÀÀÍêÕûƪÎÄÕºóÄã¾Í»á·¢ÏÖ£¬Ã¿´ÎÌáµ½µÄ¡°Ä§·¨¡±Òâζ×ÅÕâÀïÊÇ×îÖµµÃ¡°¹Û¹â¡±µÄʱ¿Ì£º
#2. ÔÚÿ¸öÔËÐеĽø³ÌÖе÷ÓÃÉÏÃæËùÌáµ½µÄOpenHFT£¬±àÒëBondVOInterface£native
ÄÚ²¿µÄʵÏÖ£¬Ê¹µÃ¸üºÃµØ¿ØÖÆ×Ö½ÚѰַÔËË㣬²¢Íê³É·Ç¶Ñ´æ´¢ÖеÄabstractAccess()/abstractMutate()²Ù×÷ÉèÖã¨Ê¹ÓýӿÚgetXX()/setXX()²¢×ñÑJavaBeanµÄÃüÃû¹æ·¶£©¡£OpenHFTÔËÐÐʱ²ÉÓÃÄãµÄ½Ó¿Ú²¢ÔÚÒ»¸öʵÏÖÀàÖбàÒ룬Õ⽫ΪÄãÌṩÁ˸üΪÃ÷È·µÄ·Ç¶Ñ´æ´¢ÐÔÄܵÄÇÅÁº¡£Êý×é±»·â×°³É´øÓÐË÷ÒýµÄgetterºÍsetter£¬Êý×éµÄ½Ó¿ÚÒ²ÒÔͬÑùµÄ·½Ê½Éú³ÉÒ»¸öÍⲿ½Ó¿Ú¡£Êý×éµÄsetterºÍgetterµÄÃüÃû·½Ê½Îª
setXxxxAt(int index, Type t); and getXxxxAt(int index);
£¨×¢£ºÊý×éµÄgettr/settrµÄÃüÃû¾ùÒÔ¡°At¡±ºó׺½á⣩¡£
ËùÓÐϸ½ÚÒѾͨ¹ýOpenHFT JIT±àÒëÆ÷ÖеÄÒ»¸öÕýÔÚÔËÐеĽø³ÌÀ´ÏòÄãÃèÊöÇå³þÁË¡£ÄãÏÖÔÚÖ»Òª×öµÄ¾ÍÊÇÌṩ½Ó¿Ú¡£ÊDz»ÊǺܿᰡ£¿
APIÖеÄshm.put(K, V); ͨ¹ý¼üÖµ (V = BondVOInterface) °ÑÊý¾ÝÈû½ø·Ç¶Ñ´æ´¢µÄSHMÖС£ÕâÑùÎÒÃÇ¿ÉÒÔ¿çÔ½ÔÚ[2]Öн¨Á¢µÄOpenHFTµÄÇÅÁº¡£
ÎÒÃÇÏÖÔÚ¾ÍÊǷǶѴ洢À²£¡ÕæÊÇÌ«ÉñÆæÁË£¬²»ÊÇÂ𣿠:-)
ÎÒÃǽÓÏÂÀ´¿´¿´ÈçºÎ´ÓPID 2µ½´ïÕâÒ»²½¡£
#4. Ò»µ©PID 1ÒѾÍê³ÉÁ˰ÑËüµÄÊý¾ÝÈû½ø·Ç¶Ñ´æ´¢SHMÖУ¬PID 2²Å¿ªÊ¼µ÷ÓÃÍêÈ«ÏàͬµÄOpenHFT¹¤³§À࣬ÈçÏÂËùʾ£º
SharedHashMap<String, BondVOInterface> shmB = new SharedHashMapBuilder() 2 .generatedValueType(true) 3 .entrySize(512) 4 .create( 5 new File("/dev/shm/myBondPortfolioSHM"), 6 String.class, 7 BondVOInterface.class 8 );
|
¿ªÊ¼Ëüºá¿çOpenHFTËù¹¹½¨µÄÇÅÁºµÄÂó̡£µ±È»£¬¼ÙÉèPID 1ºÍPID 2ÊÇ´æÔÚÓÚͬһ̨±¾µØ»ú×ӵIJÙ×÷ϵͳÖУ¬¹²ÏíÎļþ¼Ð
/dev/shm (ͬÑù¾ßÓÐÓÅÏÈ·ÃÎÊ /dev/shm/myBondPortfolioSHM Îļþ¼ÐȨÏÞ).
#5. PID 2 µ÷ÓÃV = shm.get(K); (ÿ´Î¶¼»á´´½¨Ò»¸öеķǶѴ洢µÄÒýÓÃ) »òÕß
PID 2 µ÷Óà V2 = shm.getUsing(K, V); À´¸ù¾ÝÄãµÄÑ¡ÔñÖØÐÂÒýÓÃÒ»¸ö·Ç¶Ñ´æ´¢
(»òÕßµ± K ²»ÊÇÒ»¸öEntry µÄʱºò·µ»ØNULL)¡£ÔÚOpenHFTµÄAPIÖУ¬»¹ÓеÚÈýÖÖ »ñÈ¡ Ç©ÃûµÄ·½Ê½Ìṩ¸ø
PID 2: V2 = acquireUsing(K,V); ÆäÖеIJî±ðÊÇ£¬K ±ØÐë²»ÄÜÊÇÒ»¸ö Entry,
ÕâÑùÄã¾Í½«²»»á·µ»ØNULL - µ«ÊÇ - ÏàÓ¦µÄÄã ½«»á·µ»ØÒ»¸öÐÂÌṩµÄ·ÇNULL V2µÄռλ·ûÒýÓà ¡£Õâ¸öÒýÓÃÔÊÐí
PID 2 Êʵ±µØÈ¥²Ù×÷λÓÚSHMµÄ·Ç¶Ñ´æ´¢ V2 Entry¡£
×¢: ÿµ± PID 2 µ÷Óà V = shm.get(K); Ëü¾Í»á·µ»ØÒ»¸öеķǶѴ洢µÄÒýÓá£Õâ¾ÍʹµÃÄãÿ´ÎΪÕâЩÊý¾Ý´´½¨ÒýÓõÄʱºò²úÉúÁ˺ܶàÀ¬»ø£¬Ö±µ½ÄãÏú»ÙËü¡£
È»¶ø£¬ µ± PID2 µ÷Óà V2 = shm.getUsing(K, V); »òÕß V2 = shm.acquireUsing(K,
V);, ·Ç¶Ñ´æ´¢µÄÒýÓþͱ»ÒƵ½Ð¼üÖµµÄλÖÃÉÏ£¬¶øÕâ¸ö²Ù×÷»á¼õÉÙGC£¬ÒòΪÄãÒѾ×Ô¼ºÔÚ»ØÊÕÿһ¸ö¶«Î÷ÁË¡£
×¢£ºÔÚÕâ¸öµØ·½ÊÇûÓп½±´·¢ÉúµÄ£¬Ö»ÓÐÔÚÊý¾ÝλÓڷǶѴ洢¿Õ¼ä²Å»á±»ÉèÖûòÕ߸ı䡣
1 BondVOInterface bondVOB = shmB.get("369604103"); 2 assertEquals(5.0 / 100, bondVOB.getCoupon(), 0.0); 3 BondVOInterface.MarketPx mpx930B = bondVOB.getMarketPxIntraDayHistoryAt(0); 4 assertEquals(109.2, mpx930B.getAskPx(), 0.0); 5 assertEquals(106.9, mpx930B.getBidPx(), 0.0); 6 BondVOInterface.MarketPx mpx1030B = bondVOB.getMarketPxIntraDayHistoryAt(1); 7 assertEquals(109.7, mpx1030B.getAskPx(), 0.0); 8 assertEquals(107.6, mpx1030B.getBidPx(), 0.0);
|
#6. Ò»¸ö·Ç¶Ñ´æ´¢µÄ¼Ç¼ÊÇÒ»¸öΪÁ˷ǶѴ洢²Ù×ÝºÍÆ«Òƶø°ü×°³É×Ö½ÚµÄÒýÓá£Í¨¹ý¸Ä±äÕâÁ½¸ö£¬Ö»ÒªÊÇÄãÑ¡ÔñµÄ½Ó¿Ú£¬ÄÚ´æµÄÈκνÇÂä¶¼Äܱ»·ÃÎÊ¡£µ±PID
2²Ù×÷'shm'µÄÒýÓã¬ÉèÖÃÁËÕýÈ·µÄ×Ö½ÚºÍÆ«ÒÆ£¬¶ÁÈ¡´æ´¢ÔÚ/dev/shmÎļþÊÓͼµÄ¹þÏ£Ó³ÉäÀ´½øÐÐÔËËã¡£ÔÚgetUsing()·µ»Øºó£¬Æ«ÒÆÁ¿µÄ¼ÆËãÊÇ΢ºõÆä΢µÄ£¬Ò²ÊÇÄÚÁªµÄ¡£¼´Ò»µ©´úÂë¾¹ýJITed±àÒëµÄ£¬get()ºÍset()·½·¨¾Í»á±ä³É¼òµ¥µÄ»úÆ÷´úÂëÖ¸ÁîÀ´·ÃÎÊÕâЩ×ֶΣ¬Ö»ÓÐÔÚÄã·ÃÎʵÄ×Ö¶ÎÊǿɶÁ»òÕß¿ÉдµÄ£¬Õâ²ÅÊÇÕæÕýÒâÒåÉϵÄÁ㿽±´£¡·Ç³£°ô£¡
//ZERO-COPY 02 // our reusable, mutable off heap reference, generated from the interface. 03 BondVOInterface bondZC = DataValueClasses.newDirectReference(BondVOInterface.class); 04 // lookup the key and give me my reference to the data if it exists. 05 if (shm.getUsing("369604103", bondZC) != null) { 06 // found a key and bondZC has been set 07 // get directly without touching the rest of the record. 08 long _matDate = bondZC.getMaturityDate(); 09 // write just this field, again we need to assume we are the only writer. 10 bondZC.setMaturityDate(parseYYYYMMDD("20440315")); 11 //demo of how to do OpenHFT off-heap array[ ] processing 12 int tradingHour = 2; //current trading hour intra-day 13 BondVOInterface.MarketPx mktPx = bondZC.getMarketPxIntraDayHistoryAt(tradingHour); 14 if (mktPx.getCallPx() < 103.50) { 15 mktPx.setParPx(100.50); 16 mktPx.setAskPx(102.00); 17 mktPx.setBidPx(99.00); 18 // setMarketPxIntraDayHistoryAt is not needed as we are using zero copy, 19 // the original has been changed. 20 } 21 } 22 // bondZC will be full of default values and zero length string the first time. 23 // from this point, all operations are completely record/entry local, 24 // no other resource is involved. 25 // now perform thread safe operations on my reference 26 bondZC.addAtomicMaturityDate(16 * 24 * 3600 * 1000L); //20440331 27 bondZC.addAtomicCoupon(-1 * bondZC.getCoupon()); //MT-safe! now a Zero Coupon Bond. 28 // say I need to do something more complicated 29 // set the Threads getId() to match the process id of the thread. 30 AffinitySupport.setThreadId(); 31 bondZC.busyLockEntry(); 32 try { 33 String str = bondZC.getSymbol(); 34 if (str.equals("IBM_HY_2044")) 35 bondZC.setSymbol("OPENHFT_IG_2044"); 36 } finally { 37 bondZC.unlockEntry(); 38 }
|
Òâʶµ½È«¾ÖµÄOpenHFTµÄ¶Ñ´æ´¢¡û¡ú·Ç¶Ñ´æ´¢µÄħ·¨»áÔÚÒÔÉϵÄͼ±íÖз¢ÉúÊǷdz£ÖØÒªµÄ¡£
ÊÂʵÉÏ£¬ÔÚµÚ#6²½£¬OpenHFT SHMµÄʵÏÖÊÇÔÚÔËÐÐʱÀ¹½Øarg-2£¬ÖØÔØ V2 = shm.getUsing(K,
V);¡£±¾ÖÊÉÏ£¬SHMʵÏÖµÄÊDzéѯ£º
(
2
( arg2 instanceof Byteable ) ?
3
ZERO_COPY :
4
COPY
5
) |
ÒÔ¼°×÷ΪÁ㿽±´À´Ö´ÐУ¨Í¨¹ý¸üÐÂÒýÓã©£¬À´È¡´úÍêÕû¿½±´£¨Í¨¹ýExternalizable£©¡£
ÈçºÎʵÏַǶѴ洢ÒýÓù¦ÄܵĹؼü½Ó¿ÚÊÇByteable¡£ÕâÊÇÔÊÐíÒýÓã¨ÖØÐ£©·ÖÅäµÄ¡£
public interface Byteable {
2
void bytes(Bytes bytes, long offset);
3
}
|
Èç¹ûÄãʵÏÖÁËÄã×Ô¼ºµÄÀàÈ¥Ö§³ÖÕâ¸ö·½·¨£¬Äã¿ÉÒÔʵÏÖ»òÕßÉú³ÉÊôÓÚÄã×Ô¼ºµÄByteableµÄÀà¡£
Ö±µ½ÏÖÔÚ£¬Èç֮ǰÎÒÃÇËùÌáµ½µÄ£¬Äã¿ÉÄÜÒѾ½û²»×¡¾õµÃ¡°ÕâÒ»Çз¢ÉúµÃÌ«ÆæÃîÁË¡±¡£ÕâËùÓеÄħ·¨¾ÍÔÚÓ¦ÓóÌÐòÖ´ÐеĽø³ÌÖз¢ÉúÁË£¡Ê¹ÓÃÔËÐбàÒëÆ÷×÷Ϊ
BondVOInterface ½Ó¿ÚµÄÊäÈ룬OpenHFTÄÚ²¿È·¶¨Á˽ӿڵÄÔ´Âë²¢±àÒë¸ÃÔ´Â루ͬÑùµÄ£¬ÊÇÔÚ½ø³ÌÖУ©µ½OpenHFTµÄʵÏÖÀà¡£Èç¹ûÄã²»ÏëÔÚÔËÐйý³ÌÖвÅÉú³É¸ÃÀ࣬Äã¿ÉÒÔÌáǰÉú³É²¢ÔÚ¹¹½¨µÄʱºò±àÒëËü¡£OpenHFTÄÚ²¿»áÖØÐ¼ÓÔØÐµÄʵÏÖÀൽ¿ÉÔËÐеÄÉÏÏÂÎÄÖС£½ÓÏÂÀ´£¬ÔËÐÐʱÔÙÎïÀíÖ´ÐÐ
BondVOInterface£native ÄÚ²¿ÀàÉú³ÉµÄ·½·¨È¥Ó°ÏìÓ³Éäµ½·Ç¶Ñ´æ´¢µÄ
Bytes[]¼Ç¼ÉϵÄÁ㿽±´²Ù×÷Æ÷µÄÈÝÁ¿¡£Õâ¸öÈÝÁ¿ÊÇÁ㿽±´µÄ£¬ËùÒÔÄ㽫ÔÚÒ»¸öÏß³ÌÉÏÖ´ÐÐḬ̈߳²È«²Ù×÷£¬Õâ¶ÔÁíÒ»¸öÏß³ÌÊǿɼûµÄ£¬¾¡¹ÜÁíÒ»¸öÏß³ÌÊÇÔÚ±ðµÄ½ø³ÌÖС£
Äã¿ÉÒÔ¿´µ½OpenHFT SHMÆæ¼£Ö®´¦£ºJavaÏÖÔÚÓµÓÐÕæÕýÒâÒåÉϵÄÁ㿽±´IPC¡£
ÐÔÄܽá¹û: CHM vs.SHM
On Linux 13.10, i7-3970X CPU @ 3.50GHz, hex core, 32
GB of memory.
SharedHashMap -verbose:gc -Xmx64m
ConcurrentHashMap -verbose:gc -Xmx30g
µ±È»£¬Ö÷Òªµ¼ÖÂCHMµÍÓÚSHM438%µÄÔÒòÊÇ£¬CHMÒªÈÌÊÜ21.8ÃëµÄSTW GCʼþ¡£µ«ÊÇ´ÓSLAµÄ½Ç¶ÈÀ´¿´£¬µ¼ÖÂÕâ¸öµÄÔÒò£¨²¢Ã»ÓÐÕë¶Ô´Ë½øÐв¹¾È£©ÊÇÎ޹ؽôÒªµÄ¡£¶ÔÓÚSLAÀ´Ëµ£¬CHMÖ»ÊÇÂýÁË438%¡£¶ø´ÓSLAµÄ½Ç¶ÈÀ´¿´£¬CHMµÄÐÔÄÜÊÇÄÑÒÔÈÌÊܵÄÂý¡£
JSR-107µÄ×ÔÊÊÐÔ£ºSHMΪ£¨100£¥¿É»¥²Ù×÷£©·Ç¶Ñ´æ´¢µÄJCACHEÔËËã¶ÔÏó
Java Community Process½«ÔÚ2014ÄêµÚ¶þ¼¾¶ÈÐû²¼JCACHEËù·¢²¼µÄJSR-107
EG±ê×¼¹æ·¶¡ª¡ªJava»º´æ±ê×¼API/SPI¡£ JCACHE ½«»áΪJava»º´æÉçÇø×öÄÇЩ¹ýÈ¥JDBCΪJava
RDBMSÉçÇø×öµÄÊÂÇé¡£ÔÚJCACHEµÄºËÐĺͻù´¡ÊÇËüÔʼµÄ»º´æ²Ù×÷½Ó¿Ú javax.cache.Cache<K,V>¡£Èç¹û×Ðϸ¿´Cache
API¾Í»á·¢ÏÖCache·Ç³£½Ó½üMapµÄ³¬¼¯£¨Ö»ÓÐÒ»µãµãѧÊõÉϵIJî±ð£©¡£JCACHEÆäÖÐÒ»¸öÖ÷ҪĿµÄÊǰïÖúʵÏÖ¿ÉÀ©Õ¹µÄ£¨ÏòÉϺÍÏòÍâÀ©Õ¹£©½â¾ö
JavaÊý¾Ý¾Ö²¿ÐÔ¡¢Ñӳٺͻº´æµÄÎÊÌâ¡£ ËùÒÔ£¬Èç¹ûJCACHEµÄÖÐÑëÔËËã¶ÔÏóÊÇÒ»¸öMap£¬¶øJCACHEÆäÖÐÒ»¸öÖ÷ÒªµÄÈÎÎñÊǽâ¾öÊý¾Ý¾Ö²¿ÐÔ/ÑÓ³ÙÐÔµÄÎÊÌ⣬ÄÇʹÓÃOpenHFTµÄ·Ç¶Ñ´æ´¢SHM×÷ΪʵÏÖJCACHEµÄÖ÷ÒªÔËËã¶ÔÏóµÄ½Ó¿Ú¾¿¾¹Êʲ»ÊʺÏÄØ£¿¶ÔÓÚijЩJava¸ßËÙ»º´æµÄʹÓÃÇé¿ö£¬
OpenHFTµÄ·Ç¶Ñ´æ´¢SHMÊǷdz£ÍêÃÀµÄ¡£
ÔÚÕâÀïÉÔµÈÆ¬¿Ì£¨ÇëÁô¸ö룩ÕâÆªÎÄÕ½«·ÖÏíÈçºÎ°ÑOpenHFT SHMÍêÈ«×÷Ϊһ¸öJSR-107¿É»¥²Ù×÷µÄ·Ç¶Ñ´æ´¢JCACHEÔËËã¶ÔÏó¡£ÔÚÕâ֮ǰ£¬ÎÒÃÇÏë³ÂÊöÕâ¸öjavax.cache.Cache½Ó¿ÚÊÇjava.util.Map½Ó¿ÚµÄ³¬¼¯ÊÂʵ¡£ÎÒÃÇÐèҪȷÇеØÖªµÀ¡°Ò»¸ö³¬¼¯Óжà´ó£¿¡±¡¡ÒòΪÕâ»áÓ°Ïìµ½ÎÒÃǾ¿¾¹ÐèÒª×ö¶àÉÙ¹¤×÷²ÅÍêÈ«´ïµ½100%ºÓ100%ÍêÈ«ÊÊÓ¦SHM×÷ΪʵÏÖ½Ó¿Ú¡£
- ʲôÊÇCache±ØÐëÌṩ£¬¶ø»ù´¡µÄHashMap²»Ìṩ£¿
Eviction, Expiration
WeakRef, StrongRef £¨Ë³±ãÌáһϣ¬ºÍ·Ç¶Ñ´æ´¢CacheµÄʵÏÖÀàÎ޹أ©
±¾µØ½ÇÉ« (ÀýÈç Hibernate L2)
EntryProcessors
ACIDÊÂÎñ´¦Àí
ʼþ¼àÌý
¡°Read Through¡± ²Ù×÷Æ÷ (ͬ²½/Òì²½)
¡°Write Behind¡± ²Ù×÷Æ÷ (ͬ²½/Òì²½)
JGRID ²ÎÓë(JSR-347)
JPA ²ÎÓë
- OpenHFT+Infinispan ¡°ÁªÒöÈÕ¡± ¼Æ»® (JCACHEÇìµä)
ÏÂͼÃèÊöµÄÊÇ¿ª·¢¹¤×÷·¶Î§ÄÚµÄһС²¿·Ö£¬Ëü½«²ÉÈ¡ÉçÇøÖ÷µ¼OpenHFT³ÌÐòԱȥÊÊÓ¦/¹±Ï×OpenHFT·Ç¶Ñ´æ´¢SHM×÷ΪÍêÕûµÄJSR-107¿É»¥²Ù×÷JCACHEÔËËã¶ÔÏó£¨ÉçÇøÖ÷µ¼¿ªÔ´JCACHE
Ìṩ·½=RedHat Infinispan)¡£
×ܽ᣺·Ç¶Ñ´æ´¢Hashmap...½ñÌ죬Ã÷Ì죬¡°Ö±µ½ÓÀÔ¶¡±
ÔÚÕâ½Ó½ü¡°×îºóÒ»Õ¾¡±£¬ÎÒÃÇÏ£ÍûÔÚÀë±ðǰ¸ø´ó¼Ò½²¸öÔ¢ÑÔ¹ÊÊÂ×÷²Î¿¼¡£
ÉçÇøÖ÷µ¼¿ªÔ´·Ç¶Ñ´æ´¢HashMap¹©Ó¦ÕߺÍJCACHEÌṩµÄ¹©Ó¦ÉÌ£¨°üÀ¨Ë½ÓкͿªÔ´£©Ö®¼äµÄ¹ØÏµ¿ÉÒÔÐͬ×÷Óõġ£Ã¿Ò»¿é¶¼ÎªÊ¹µÃ×îÖÕÓû§µÄ·Ç¶Ñ´æ´¢¾Ñé¸ü·á¸»·¢»Ó×ÅÖØÒª×÷Ó᣷ǶѴ洢Hash-MapÌṩÕß¿ÉÒÔʵÏַǶѴ洢HashMapµÄºËÐÄ£¨ÈçJCACHE£©ÔËËã¶ÔÏó¡£JCACHE¹©Ó¦ÉÌ£¨°üÀ¨Ë½ÓкͿªÔ´£©¿ÉÒÔʹÔËËã¶ÔÏóÊÊÓ¦µ½ËûÃDzúÆ·ÖУ¬È»ºóÌṩºËÐÄJCACHEÔËËã·û£¨ºÍ»ù´¡½á¹¹£©¡£
ÕâÖÖ¹ØÏµ¾ÍÏñÄÌÅ££¨ÄÌÅ©£¬Èç¹ûÄãÔ¸Ò⣬ºËÐÄÔËËã¶ÔÏóÖÆÔì·½=Å£ÄÌ£©ÓëÈéÒµ¹«Ë¾£¨Å£Ä̾ӪÕß²Ù×÷·û set={°ÍÊÏÃð¾ú£¬ÍÑÖ¬£¬1%£¬2%£¬Ò»°ëÒ»°ë£¬µÈµÈ}£©Ö®¼äµÄ¹ØÏµ¡£×ÜÖ®£¬£¨ÄÌÅ££¬ÈéÒµ¹«Ë¾£©Êǹ²Í¬Éú²úÒ»¸ö²úÆ·£¬Ê¹µÃ×îÖÕÓû§Äܹ»ÏíÊܵ½¸ßÓÚ£¨ÄÌÅ££¬ÈéÒµ¹«Ë¾£©²»ºÏ×÷¶øµÃµ½µÄ¡£×îÖÕÓû§ÊÇÐèÒªËûÃÇÁ½¸öµÄ¡£
µ«ÊÇ£¬¡°Âò¼ÒÒªµ£ÐÄ¡±Õâ¾ä»°ÒªË͸ø×îÖÕÓû§£º
ÓеÄÈËÓ¦¸Ã»áÔâÓö˽Óг§ÉÌ´«²¥±ÕÔ´·Ç¶Ñ´æ´¢HashMap/CacheµÄ½â¾ö·½°¸£¬Éù³ÆËûÃDZÕÔ´·Ç¶Ñ´æ´¢µÄÔËËã¶ÔÏóÔÚij·½Ã桰ʤÓÚ¡±¿ªÔ´ºÍÉçÇøÖ÷µ¼µÄ·½·¨¡£ºÃ°É£¬Ö»Òª¼ÇסÕâÒ»µã£º
ÈéÒµ¹«Ë¾²¢²»Éú²úÅ£ÄÌ¡£ÄÌÅ£¿ÉÒÔ²úÄÌ¡£
ÄÌţʹµÃÅ£Ä̱äµÃ¹«¿ª»¯£¬24/7£¬ÒÔ¼°ÍêÈ«²»¸Ðµ½Ñá·³µÄ½¹µã¡£ÈéÒµ¹«Ë¾¿ÉÒÔʹµÃÅ£Ä̱äµÃ¸ü¶àÔª»¯£¨Ò»°ëÒ»°ë£¬2%£¬1%£¬ÍÑÖ¬£©¡¡ËùÒÔËûÃÇÖ»ÊÇÓлú»á·¢»ÓÖØÒª×÷Óᡵ«ËûÃDz¢²»²úÄÌ¡£ÑÛÏ¿ªÔ´¡°ÄÌÅ£¡±ÊÇÖÆÔì·Ç¶Ñ´æ´¢HashMapµÄ¡°Å£ÄÌ¡±¡£Èç¹û˽Óнâ¾ö·½°¸ÌṩÉÌ¿ÉÒÔʹµÃÄǸöÅ£Ä̸ü¶àÔª»¯£¬ÄǾÍÈ¥×ö°É£¬ÕâÖÖŬÁ¦µÄ³¢ÊÔÒ²ÊÇ´ó¼ÒËùÏ£Íû¿´µ½µÄ¡£µ«ÊDz¢²»¹ÄÀøÕâЩÌṩÉÌÊÔͼȥÐû³ÆËûÃÇ˽ÓеÄÅ£ÄÌÊÇÔÚ¸÷·½Ãæ¶¼¸üʤһ³ïµÄ¡°Å£ÄÌ¡±¡£ÒòΪÄÌÅ£²ÅÊÇÖÆÔì×îºÃµÄÅ£ÄÌ¡£
×îºó£¬Java¿ªÊ¼ÈÚÈë¸ßÐÔÄܼÆËãÉçÇøÊÇÒ»¼þ¶àôֵµÃÐ˷ܵÄʰ¡¡£Ò»Çж¼»áÓкܴóµÄ±ä»¯£¬¶øËùÓеı仯¶¼ÊǺõġ£
´Ó ²¢·¢°ü, ´ÓÔ½À´Ô½¶àÓÅÐãµÄ ÏÖ´ú GC ½â¾ö·½°¸, ´Ó ·Ç×èÈû I/O ÐÔÄÜ, ´Ó Ì×½Ó×ÖÖ±½ÓÐÒéµÄ
native RDMA, JVM ÄÚ²¿·½·¨, ¡. , ËùÓеķ½·¨¶¼ÊÇͨÏò±¾µØ Caching, OpenHFTµÄSHM×÷Ϊ
ÔÉú IPC ´«Êä, ÒÔ¼° »úÆ÷¼¶±ðHTM-ÖúÊÖ¹¦ÄÜ ¶¼±»ÒªÇóÔÚÕâ¸öOpenJDK·Ç¶Ñ´æ´¢JEP£¬ÓÐÒ»µãÊÇÇå³þµÄ£ºOpenJDKµÄƽ̨ÉçÇøÈ·ÊµÊǰÑÌá¸ßÐÔÄܵÄÓÅÏȼ¶·ÅÔÚ×î¸ß¡£
have a high-priority to improve performance.
ÔÙÀ´¿´¿´Õâ¸ö¿É°®µÄÀϼһïHashMapÏÖÔÚÄÜ×öµÄ£¡OpenJDK,OpenHFT,LinuxºÍ·Ç¶Ñ´æ´¢HashMapÏÖÔÚÔÚ¡°µÍ´¦¡±ÊÇÅóÓÑÁË£¨¼´±¾µØ²Ù×÷ϵͳ£©¡£
±£»¤ºÃÏÖÔÚ²»ÊÜSTW GC¸ÉÈÅ£¬HashMapÏÖÔÚ×÷Ϊһ¸öÖØÒªµÄHPCÊý¾Ý½á¹¹ÔËËã¶ÔÏó¶øÖØÉú¡£ÓÀÝáÄêÇᣬHashMap...ÓÀÔ¶ÄêÇᣡ
¸ÐлºÍÎÒÃÇÒ»Æð¹²Í¬ÂÄÐУ¬ÎÒÃÇÏ£ÍûÄã»áÐÀÉÍÕâ´ÎµÄÂó̡£Ï´ÎÔÙ¼û¡£
|