ÃֽŠ°Ô½Ã±Û(JAVA)
2020.12.05 / 19:36

À¯¿ëÇÑ JVM Ç÷¡±× – PART 1 (JVM ŸÀÔµé°ú ÄÄÆÄÀÏ·¯ ¸ðµåµé)

Ãß¼®µ¹ÀÌ
Ãßõ ¼ö 243

Çö´ëÀÇ JVMµéÀº È¿À²ÀûÀÌ°í ¾ÈÁ¤ÀûÀÎ ¹æ¹ýÀ¸·Î ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀ»(ȤÀº JVM°ú ȣȯµÇ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾îµé) ½ÇÇà½ÃÅ°´Â ³î¶ó¿î ÀÏÀ» ÇÑ´Ù. ¸ÂÃ㠸޸𸮠°ü¸®(Adaptive memory management), °¡ºñÁö Ä÷º¼Ç(garbage collection), just-in-time compilation, µ¿Àû Ŭ·¡½º·Îµù(dynamic classloading), ¶ô ÃÖÀûÈ­(lock optimization) – ÀÌ·¯ÇÑ °ÍÀÌ ¸¶¹ýó·³ ÀοëµÇÁö¸¸ ÀϹÝÀûÀÎ ÇÁ·Î±×·¡¸Óµé¿¡°Ô Á÷Á¢ÀûÀ¸·Î ¿µÇâÀ» ÁÖÁø ¾Ê´Â´Ù. ½ÇÇà ½ÃÁ¡¿¡¼­, JVMÀº Áö¼ÓÀûÀÎ ÃøÁ¤°ú ÇÁ·ÎÆÄÀϸµÀ» ±â¹ÝÀ¸·Î ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª ±×°ÍÀÇ ÀϺθ¦ Çڵ鸵ÇÏ´Â ¹æ¹ýÀ» ÃÖÀûÈ­ÇÑ´Ù.

¿©ÀüÈ÷ JVMÀÌ ÀÚµ¿È­ ¼öÁØ°ú °°Àº °ÍÀ̳ª ±×º¸´Ù ¸øÇÑ °Íµé¿¡ ´ëÇؼ­ ¿ÜºÎ ¸ð´ÏÅ͸µÀ̳ª ¼öµ¿ Æ©´×À» À§ÇÑ ÃæºÐÇÑ ¼³ºñ¸¦ Á¦°øÇÏ°í ÀÖ´Ù´Â °ÍÀº Áß¿äÇÏ´Ù. ¿¡·¯³ª ³·Àº ÆÛÆ÷¸Õ½ºÀÇ °æ¿ì¿¡´Â ¹Ýµå½Ã Àü¹®°¡°¡ °³ÀÔÇÏ´Â °ÍÀÌ °¡´ÉÇØ¾ß ÇÑ´Ù. °Ô´Ù°¡, ¼ö¸é ¾Æ·¡¿¡¼­ ÀϾ´Â ¸ðµç ¸¶¹ý°°Àº ÀÏ ¿Ü¿¡µµ, ¾ÆÁÖ Æø ³ÐÀº ¼öµ¿ Æ©´× °°Àº°ÍÀº Çö´ë JVMÀÌ °¡Áö´Â °­·ÂÇÑ °ÍÁß¿¡ Çϳª´Ù. ƯÈ÷ Èï¹Ì·Î¿î °ÍÀº JVMÀÌ ½ÃÀ۽à ±×µé¿¡°Ô Àü´ÞµÇ¾î Áú¼ö ÀÖ´Â Ä¿¸Çµå ¶óÀÎ Ç÷¡±×µéÀÌ´Ù. ¸î¸î JVMÀº ¼ö¹é°³ÀÇ ÀÌ·¯ÇÑ Ç÷¡±×µéÀ» Á¦°øÇÏÁö¸¸ JVM¿¡ ´ëÇÑ ÀûÀýÇÑ Áö½ÄÀÌ ¾øÀÌ´Â Àؾî¹ö¸®±â ½±´Ù.ÀÌ ½Ã¸®ÁîÀÇ ¸ñÇ¥´Â ¸ÅÀÏ »ç¿ëÇÏ´Â ÀûÀýÇÑ Ç÷¡±×µéÀ» Á¶¸íÇÏ°í ±×µéÀÌ ÀåÁ¡µé¿¡ ´ëÇؼ­ ¼³¸íÇÏ´Â °ÍÀÌ´Ù. ´Ù¸¥ ÀαâÀÖ´Â JVMµé¿¡ ¾ÆÁÖ À¯»çÇÑ Ç÷¡±×°¡ Á¸ÀçÇÏÁö¸¸ ¿ì¸®´Â Java 6À¸·Î Sun/Oracle HotSpot¿¡ ÁýÁßÇÒ °ÍÀÌ´Ù.

-server ¿Í -client

HotSpot JVM¿¡´Â µÎ°³ÀÇ Å¸ÀÔÀÌ ÀÖ´Ù. À̸§ÇÏ¾ß ¡°server¡± ¿Í ¡°client¡±. ¼­¹ö(server) VMÀº ±âº»ÀûÀ¸·Î ¾ÆÁÖ Å« Èü(Heap), Æз¯·² °¡ºñÁö Ä÷ºÅÍ(parallel garbage collector)¸¦ »ç¿ëÇÏ°í ½ÇÇàŸÀÓ¿¡¼­ Á» ´õ °ø°ÝÀûÀ¸·Î Äڵ带 ÃÖÀûÈ­ ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®(client) VMÀº Á» ´õ º¸¼öÀûÀε¥, ±× °á°ú Á» ½ÃÀÛ Å¸ÀÓÀÌ Âª¾ÆÁö°í ¸Þ¸ð¸®¸¦ Á» ´õ Àû°Ô »ç¿ëÇÑ´Ù. ¡°JVM ÀÎü°øÇÐ(ergonomic)¡± À̶ó ºÒ¸®´Â ÄÁ¼Á ´öºÐ¿¡ JVMÀÇ Å¸ÀÔÀº JVMÀÌ ½ÃÀ۵ɶ§¿¡ ¿î¿µÃ¼Á¦¿Í È°¿ëÇÒ¼ö ÀÖ´Â Çϵå¿þ¾î¸¦ °í·ÁÇÑ ±âÁØ¿¡ÀÇÇؼ­ ÀÚµ¿ÀûÀ¸·Î ¼±ÅõǾîÁø´Ù. Ãß°¡ÀûÀÎ ±âÁØ(ȤÀº ±Ô°Ý)Àº ¿©±â¼­ Ã£À» ¼ö ÀÖ´Ù. ±Ô°Ý(±âÁØ) Å×À̺í·ÎºÎÅÍ, ¿ì¸®´Â Ŭ¶óÀ̾ðÆ® VMÀº ¿ÀÁ÷ 32bit ½Ã½ºÅÛ¿¡¼­¸¸ È°¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

¸¸¾à ¹Ì¸® Á¤ÀÇµÈ JVMÀÌ ºÒ¸¸À̶ó¸é, ¿ì¸®´Â ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® VM »ç¿ëÀ» ±ÔÁ¤Çϱâ À§ÇØ -server ¿Í -client Ç÷¡±×¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ºñ·Ï ¼­¹ö VMÀÌ ±âº»ÀûÀ¸·Î Àå½Ã°£ ½ÇÇàµÇ´Â ¼­¹ö ÇÁ·Î¼¼½ºµé¿¡ ÃÊÁ¡ÀÌ ¸ÂÃçÁ³Áö¸¸, ¿À´Ã³¯ ±×°ÍÀº ¾ÆÁÖ ¸¹Àº µ¶¸³ ¾ÖÇø®ÄÉÀÌ¼Ç VM¿¡¼­ Ŭ¶óÀ̾ðÆ® VM º¸´Ù ÈξÀ ³ôÀº ¼º´ÉÀ» Á¾Á¾ º¸¿©ÁØ´Ù. ³ª´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ ºü¸¥ ½ÇÇà½Ã°£ÀÌ Áß¿äÇÏ´Ù°í ÇÒ¶§¿¡ -server Ç÷¡±×¸¦ ¼¼ÆÃÇÔÀ¸·Î½á ¼­¹öVMÀ» ¼±ÅÃÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù. ÀϹÝÀûÀ¸·Î, 32-bit ½Ã½ºÅÛ¿¡¼­, HotSpot JDK´Â ¸ðµÎ ¼­¹öVMÀ¸·Î µ¿ÀÛÇϵµ·Ï ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. – 32bit JRE¸¸ Ŭ¶óÀ̾ðÆ®VMÀ» žÀçÇÑ´Ù.

-version °ú -showversion

¾î¶»°Ô ¿ì¸®´Â ÀÚ¹Ù°¡ ¼³Ä¡µÇ¾î ÀÖ°í JAVA¸¦ È£ÃâÇßÀ»¶§¿¡ JVM ŸÀÔÀÌ ¾î¶²°ÇÁö¸¦ ¾Ë ¼ö ÀÖÀ»±î? ½Ã½ºÅÛ¿¡ Çϳª ÀÌ»óÀÇ JAVA°¡ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é ¾Æ¹«·± ¾Ë¸²¾øÀÌ À߸øµÈ JVMÀÌ ½ÇÇàµÉ ¾à°£ÀÇ À§Ç輺ÀÌ Ç×»ó ÀÖ´Ù. ÀÌ·¯ÇÑ °üÁ¡¿¡¼­,ºñ·Ï ³»°¡ Çظ¦ °ÅµìÇÒ¼ö·Ï ÁÁ¾ÒÁ³´Ù´Â °ÍÀ» ÀÎÁ¤ÇÑ´ÙÇصµ, ÀαâÀÖ´Â ´Ù¾çÇÑ ¸®´ª½º ¹èÆ÷ÆÇ¿¡´Â JVMÀÌ ¹Ì¸® ¼³Ä¡µÇ¾ú´Ù.

¿î ÁÁ°Ô, ¿ì¸®´Â -version Ç÷¡±×¸¦ È°¿ëÇÒ ¼ö ÀÖ´Ù. »ç¿ëµÇ¾îÁø JVM¿¡ ´ëÇÑ °£´ÜÇÑ Á¤º¸¸¦ Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¸é,

Ãâ·ÂµÈ ³»¿ëÀ» º¸¸é JAVA ¹öÀü ³Ñ¹ö(1.6.0_24)¿Í »ç¿ëµÈ Á¤È®ÇÑ JREÀÇ ºôµåID(1.6.0_24-b07) ¸¦ º¸¿©ÁØ´Ù. ¶Ç, ¿ì¸®´Â À̸§À»(HotSpot) º¼¼ö ÀÖ°í, JVMÀÇ ºôµåID(19.1-b02) ¿Í ŸÀÔ(Client)µµ º¼ ¼ö ÀÖ´Ù. °Å±â¿¡ ´õÇØ, ¿ì¸®´Â JVM ÀÌ ¹Í½ºµå ¸ðµå(mixed mode)·Î µ¿ÀÛÇÑ´Ù´Â°É ¾Ë ¼ö ÀÖ´Ù. ÀÌ ½ÇÇà ¸ðµå´Â ±âº»ÀûÀÎ HotSpot ¸ðµåÀÌ°í ½ÇÇà ŸÀÓ¿¡ µ¿ÀûÀ¸·Î ¹ÙÀÌÆ® ÄÚµå(byte code)¸¦ ³×ÀÌƼºê ÄÚµå(nate code)·Î ÄÄÆÄÀÏ ÇÑ´Ù´Â °É ÀǹÌÇÑ´Ù. ¶Ç, ¿ì¸®´Â Ŭ·¡½º µ¥ÀÌÅÍ °øÀ¯(class data sharing)°¡ È°¼ºÈ­ µÇ¾ú´Ù´Â °Íµµ ¾Ë ¼ö ÀÖ´Ù. Ŭ·¡½º µ¥ÀÌÅÍ °øÀ¯´Â ¸ðµç JAVA ÇÁ·Î¼¼½ºµéÀÌ Å¬·¡½º·Î´õ¿¡ ÀÇÇؼ­ ÀÚ¿øÀ» °øÀ¯Çϴµ¥ »ç¿ëµÇ¾îÁö´Â ÀбâÀü¿ë ij½¬¿¡ JRE ÀÇ ½Ã½ºÅÛ Å¬·¡½ºµéÀ» ÀúÀåÇÏ´Â ±â¹ýÀÌ´Ù. Ŭ·¡½º µ¥ÀÌÅÍ °øÀ¯´Â ¸Å¹ø jar archiveµé·ÎºÎÅÍ ¸ðµç Ŭ·¡½º µ¥ÀÌÅ͸¦ ÀоîµéÀÌ´Â °Í°ú ºñ±³Çغ¼¶§ ¼º´É¸é¿¡¼­ ´ëü·Î À̵æÀÌ ÀÖ´Ù.

-version Ç÷¡±×´Â À§ µ¥ÀÌÅ͸¦ Ãâ·ÂÇÑ ÈÄ¿¡ Áï°¢ JVMÀ» Á¾·áÇÑ´Ù. ±×·¯³ª, °°Àº Ãâ·Â°á°ú¸¦ ¸¸µå´Âµ¥ »ç¿ëµÇ¾îÁú ¼ö ÀÖ´Â -showversion ´Â À¯»çÇÑ Ç÷¡±×Áö¸¸ ÁÖ¾îÁø ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇÏ°í ó¸®ÇÑ´Ù. µû¶ó¼­ -showversion Àº °ÅÀÇ ¸ðµç ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀÇ Ä¿¸Çµå ¶óÀο¡ À¯¿ëÇÏ°Ô Ãß°¡µÇ¾ú´Ù. ¿©·¯ºÐÀº °©Àڱ⠾ Á¤º¸°¡ ÇÊ¿äÇÒ¶§ Ưº°ÇÑ(±úÁø) ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëµÈ JVM¿¡ ´ëÇؼ­ ¾Ë¼ö°¡ ¾ø´Ù. ½ÃÀ۽ÿ¡ -showversion À» Ãß°¡ÇÔÀ¸·Î½á, ¿ì¸®´Â ¿ì¸®°¡ ÇÊ¿ä·ÎÇÒÁö ¸ð¸£´Â ½ÃÁ¡¿¡¼­ È°¿ë°¡´ÉÇÑ ÀÌ·¯ÇÑ Á¤º¸¸¦ ¾ò´Â°ÍÀ» º¸Àå¹ÞÀ» ¼ö ÀÖ´Ù.

-Xint, -Xcomp, ±×¸®°í Xmixed

µÎ°³ÀÇ Ç÷¡±× -Xint, -Xcomp ´Â ¿ì¸®°¡ ¸ÅÀÏ ÇÏ´ÂÀÏ°ú °ü·ÃÀÌ ¾øÁö¸¸ JVM¿¡ ´ëÇؼ­ ¹«¾ð°¡¸¦ ¹è¿ì±â À§ÇÑ ¾ÆÁÖ Å« ÁÖÁ¦°¡ ÀÖ´Ù. -Xint ´Â JVM¿¡°Ô ¸ðµç ¹ÙÀÌÆ®ÄÚµå(Bytecode)¸¦, Åë»óÀûÀ¸·Î 10¹è ÀÌ»ó ¾ÆÁÖ ´À·ÁÁö´Â °ÍÀÌ ¼ö¹ÝµÇ´Â, ÀÎÅÍÇÁ¸®ÅÍ ¸ðµå·Î ½ÇÇàÇϵµ·Ï °­Á¦ÇÑ´Ù. ÀÌ¿Í ´ëÁ¶ÀûÀ¸·Î, Ç÷¡±× -Xcomp ´Â ¸í½ÃÀûÀ¸·Î Á¤¹Ý´ë·Î µ¿ÀÛÇϵµ·Ï °­Á¦Çϴµ¥ ±×°ÍÀº JVMÀÌ Ã³À½ »ç¿ë½Ã¿¡ ¸ðµç ¹ÙÀÌÆ®Äڵ带 ³×ÀÌƼºêÄÚµå(Native code)·Î ÄÄÆÄÀÏÇϴµ¥ °á±¹ ÃÖ°íÀÇ ÃÖÀûÈ­ ·¹º§À» Àû¿ëÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº ¾ÆÁÖ µè±âÁÁÀº ¼Ò¸®Àε¥, ¿Ö³ÄÇϸé ÀÎÅÍÇÁ¸®ÅÍÀÇ ´À¸²À» ÇÇÇÏ´Â ¿Ïº®ÇÑ ¹æ¹ýÀ̱⠶§¹®ÀÌ´Ù. ÇÏÁö¸¸ ¸¹Àº ¾ÖÇø®ÄÉÀ̼ǵéÀº -Xinit °¡ ¼º´ÉÀúÇÏ°¡ ¹ß»ýÇÑ´Ù´Â ´Ü ÇϳªÀÇ ÀÌÀ¯¿Í ºñ±³ÇÏ´õ¶óµµ -Xcomp ÀÇ »ç¿ëÀº ÀûÀº ¼º´É Â÷À̸¦ °Þ°Ô µÈ´Ù. ±× ÀÌÀ¯´Â -Xcomp ¼¼ÆÃÀº JVM¿¡°Ô JIT ÄÄÆÄÀÏ·¯(JIT Compiler)°¡ È¿À²ÀûÀ¸·Î ³×ÀÌƼºê Äڵ带 ¸¸µé¾î³»´Â °ÍÀ» ¹æÇØÇÏ°Ô ÇÑ´Ù. JIT ÄÄÆÄÀÏ·¯´Â ½ÇÇàŸÀÓ¿¡ ¸Þ¼Òµå »ç¿ë ÇÁ·ÎÆÄÀϵéÀ» »ý¼ºÇÑ ´ÙÀ½¿¡ ½ÇÁ¦ ¾ÖÇø®ÄÉÀÌ¼Ç µ¿ÀÛÀ» À§ÇØ Â÷·Ê´ë·Î ±×µéÀÇ ÀϺγª ȤÀº Ãß·ÐÀ» Çؼ­ ½Ì±Û ¸Þ¼ÒµåµéÀ» ÃÖÀûÈ­ÇÑ´Ù. ÀÌ·¯ÇÑ ÃÖÀûÈ­ Å×Å©´ÐÀÇ ÀϺεéÀº, ¿¹¸¦µé¾î optimistic branch prediction, ¸Ç óÀ½¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇÁ·ÎÆÄÀϸµ ¾øÀÌ È¿À²ÀûÀ¸·Î Àû¿ëµÇ¾îÁú ¼ö ¾ø´Ù. ¶Ç ´Ù¸¥ °üÁ¡À¸·Î ¸Þ¼Òµå´Â ±×µé ½º½º·Î°¡ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ¾î¶² Á¾·ùÀÇ ÁöÁ¡À» ±¸¼ºÇϴµ¥ ¿¬°üµÇ¾î ÀÖ´Ù´Â °ÍÀÌ Áõ¸íµÇ¾úÀ»¶§ Àüü°¡ ÄÄÆÄÀϵǾî Áø´Ù. ¿ÀÁ÷ ÇѹøÀ̳ª ¾ÆÁÖ Àû°Ô È£ÃâµÇ¾îÁö´Â ¸Þ¼ÒµåµéÀº ÀÎÅÍÇÁ¸®ÅÍ ¸ðµå·Î ½ÇÇàµÇ´Â °ÍÀ» Áö¼ÓÇÏ°Ô µÇ°í µû¶ó¼­ compilation °ú ÃÖÀûÈ­(optimzation) ºñ¿ëÀ» Àý¾àÇÏ°Ô µÈ´Ù.

¿ì¸®´Â -Xmixed Ç÷¡±×¸¦ °¡Áö´Â mixed ¸ðµå¸¦ ÁÖ¸ñÇÏÀÚ. ÃÖ½ÅÀÇ HotSpot ¹öÀü¿¡¼­, mixed mode´Â ±âº»°ªÀÌ µÆ°í ¿ì¸®´Â ´õ ÀÌ»ó ÀÌ Ç÷¡±×¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

Çؽ¬¸Ê(HashMap)¿¡ °´Ã¼¸¦ ä¿ö³Ö°í ±×°ÍÀ» ´Ù½Ã ¹Þ´Â°ÍÀ» ¹Ýº¹ÇÏ´Â »ùÇà º¥Ä¡¸¶Å© ¿¹Á¦ÀÇ °á°ú¸¦ »ìÆ캸ÀÚ. °¢°¢ÀÇ º¥Ä¡¸¶Å©°¡ º¸¿©ÁÖ´Â ½ÇÇà½Ã°£Àº ¼ö ¸¹Àº »ùÇà ½ÇÇàÀÇ Æò±Õ °ªÀÌ´Ù.

´ç¿¬È÷ º¥Ä¡¸¶Å©´Â -Xcomp °¡ ÃÖ°í¶ó´Â °ÍÀ» º¸¿©ÁØ´Ù. ÇÏÁö¸¸ ¿©ÀüÈ÷, ±×¸®°í Ưº°È÷ ¾ÆÁÖ ¿À·£½Ã°£µ¿¾È ½ÇÇàµÇ´Â ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇؼ­, ³ª´Â ¸ðµç »ç¶÷µé¿¡°Ô °­·ÂÇÏ°Ô JVM ±âº» ¼¼ÆÃÀ¸·Î ³öµÎ¶ó°í ÇÏ°í JIT ÄÄÆÄÀÏ·¯ÀÇ ´Ù¾çÇÑ ÀáÀç´É·ÂÀ» ¸ðµÎ »ç¿ëÇϵµ·Ï ¸¸µé¶ó°í Á¶¾ðÇÑ´Ù. °á±¹, JIT ÄÄÆÄÀÏ·¯´Â JVMÀÇ ¾ÆÁÖ º¹ÀâÇÏ°í Á¤±³ÇÑ ÄÄÆ÷³ÍÆ®(component)Áß¿¡ ÇϳªÀÌ´Ù. – »ç½Ç, ÇöÀç ÀÌ ºÎºÐÀÇ ¹ßÀüÀº ¿À´Ã³¯ ÀÚ¹Ù°¡ ´õ ÀÌ»ó ´À¸®Áö ¾Ê´Ù°í »ý°¢ÇÏ°Ô ¸¸µå´Â °¡Àå Å« ÀÌÀ¯´Ù.