JAVA/JVM 관련 질문 있습니다. (Linux CentOS 7,x, openjdk8 사용)
프로그램이 대략 다음과 같습니다.
DATA는 100KB이고 FILE B는 200KB라 가정하고
File file=new File("A")
file.write(DATA)
file.close
system("mv B A") //사정이 있어서 FILE IO의 RENAME()을 사용하지 못합니다
File file=new File("A")
하고
file.length를 보면 100KB로 나옵니다.
"system" 전이나 후에 0.5sec 정도 sleep을 주면 정상 작동합니다.
누군가 (아마도 JVM) CACHE를 하는것 같은데 어디에도 SPEC이 없습니다.
방법이 없을까요?
system("sync")
ÇÏ¸é ¾î¶»°Ô µÉÁö ±Ã±ÝÇÕ´Ï´Ù!
openjdk°¡ ±¸Çöü Áß¿¡ Çϳª¶ó¼ oracle java¶û ¹Ì¹¦ÇÏ°Ô Á» ´Ù¸¥°Í °°±äÇÏ´õ¶ó±¸¿ä
system("stat A")
Çϸé 200K·Î ³ª¿É´Ï´Ù.
stat ¾Æ´Ï°í sync·Î Çغ¸°í.. ±×·¡µµ ¾ÈµÇ¸é
file.seek() ¸Þ¼Òµå µîÀ¸·Î ÆÄÀÏÀ» Á÷Á¢ ³¡À¸·Î À̵¿, óÀ½À¸·Î À̵¿Çؼ
ÆÄÀϱæÀÌ°¡ ¾÷µ¥ÀÌÆ® µÇ´ÂÁö È®ÀÎÇغ¸´Â°Íµµ ¹æ¹ýÀϵí ÇÕ´Ï´Ù.
exception ³ª¿ä
±×¸®°í ´ç¿¬È÷ Ä«ÇÇ Çϴµ¥ ½Ã°£ÀÌ °É¸®Áö ¾ÊÀ»±î¿ä?
ÀÚ¹Ù½ºÅ©¸³Æ®¿´À¸¸é.. ±×³É Äݹé ó¸® ÇÏ¸é µÇ´Âµ¥ ÀÚ¹Ùµµ Äݹé ÇÔ¼ö°¡ ÀÖÀ»µí Çѵ¥¿ä..
µ¿±â±â ¶§¹®¿¡ JVMÀÌ CACHE¸¦ ÇÏÁö ¾Ê´ÂÇÑ ÀÌ·¯¸é ¾ÊµÇ°Åµç¿ä
ã¾Æº¸·Á°í Çϴµ¥
java¿¡¼ ÇÁ·Î¼¼½º ¸¸µé¾î¼ ½© ¸í·É¾î ½ÇÇàÇÏ°Ô µÇ¸é ºñµ¿±â·Î 󸮰¡ µÇ¾î¼ waitfor °°Àº°É·Î
´ë±âÇØÁà¾ß ÇÏ´Â°Í °°¾Æ º¸À̴µ¥ system À̶õ ¸í·É¾î´Â Ʋ¸°°¡¿ä ?
system À̶õ ´Ü¾î°¡ ÈçÇÑ ´Ü¾î¶ó ±¸±Û °Ë»ö¿¡¼ °Ë»öÀÚüµµ Èûµå³×¿ä ¤Ì¤Ì
JAVA¿¡¼ systemÀº runtime.exec, processbuilder µîÀÌ ÀÖ°ÚÁö¸¸ ...
Áö±Ý ¹®Á¦´Â JVMÀÌ ¾Õ¿¡¼ »ç¿ëÇÑ ÆÄÀÏ A¿¡ ´ëÇÑ ATTR Á¤º¸¸¦ CACHEÇÏ°í Àֱ⠶§¹®ÀÔ´Ï´Ù.
JVMÀÌ CACHE¸¦ ÇÏ´Â°Ô ³ª»Û°Ç ¾Æ´Ñµ¥ ÀÌ°É Á¶Á¤ÇÏÁö ¸øÇÏ°Ô ÇØ ³õÀº°Ô ´ä´äÇÑ °Å¿¡¿ä (¾Æ´Ï¸é Á¦°¡ ¹æ¹ýÀ» ¸ð¸£°Å³ª)
file = null;
ÀÌ·±½ÄÀ¸·Î °Á¦·Î ÇÒ´çÇعö¸®°í ´Ù½Ã Àç»ç¿ëÇϴ°ÅÁÒ
°Ë»öÇغ¸´Ï try ¸¦ ½á¼ ºí·ÏÈ ½ÃÅ°´Â°Ô Àִµ¥ ±×·¸°Ô Çغ¸½Ã¸é ¾î¶³±î ÇÕ´Ï´Ù.
https://stackoverflow.com/questions/2016299/does-java-have-a-using-statement
c# ÇüŶó¸é ÀÌ·¸°Ô µÇ°ÚÁÒ.
using(File file=new File("A"))
{
file.write(DATA);
file.close;
}
system("mv B A"); //»çÁ¤ÀÌ ÀÖ¾î¼ FILE IOÀÇ RENAME()À» »ç¿ëÇÏÁö ¸øÇÕ´Ï´Ù
using(File file=new File("A"))
{
; // code
;
}
±×·¡µµ ¸¶Âù°¡Áö ÀÔ´Ï´Ù.