yorknong 发表于 2017-2-20 11:05:50

【转】Resin关于最小内存设置

resin.conf 中有 <min-free-memory>设置,是resin内部有一个thread每隔10秒钟检查JVM剩余内存,如果free memory小于 2*min-free-memory,则执行Runtime.gc() 强制进行GC,如果使用-XX:+DisableExplicitGC 禁用显式调用GC,则该设置无效。
对应的代码如下(com/caucho/server/resin/Resin.java):

] view plaincopy



[*]long minFreeMemory = _server.getMinFreeMemory();  
[*]    if (minFreeMemory <= 0) {  
[*]      // memory check disabled  
[*]    }  
[*]    else if (2 * minFreeMemory < getFreeMemory(runtime)) {  
[*]      // plenty of free memory  
[*]    }  
[*]    else {  
[*]      if (log().isLoggable(Level.FINER)) {  
[*]        log().finer(L().l("free memory {0} max:{1} total:{2} free:{3}",  
[*]              "" + getFreeMemory(runtime),  
[*]              "" + runtime.maxMemory(),  
[*]              "" + runtime.totalMemory(),  
[*]              "" + runtime.freeMemory()));  
[*]      }  
[*]        
[*]      log().info(L().l("Forcing GC due to low memory. {0} free bytes.",  
[*]               getFreeMemory(runtime)));  
[*]        
[*]      runtime.gc();  
[*]        
[*]      if (getFreeMemory(runtime) < minFreeMemory) {  
[*]        _isClosed = true;  
[*]        log().severe(L().l("Restarting due to low free memory. {0} free bytes",  
[*]               getFreeMemory(runtime)));  
[*]        return;  
[*]      }  

其中getMinFreeMemory()如下:
 
] view plaincopy



[*]private static long getFreeMemory(Runtime runtime)  
[*] {  
[*]   long maxMemory = runtime.maxMemory();  
[*]   long totalMemory = runtime.totalMemory();  
[*]   long freeMemory = runtime.freeMemory();  
[*]   // Some JDKs (JRocket) return 0 for the maxMemory  
[*]   if (maxMemory < totalMemory)  
[*]     return freeMemory;  
[*]   else  
[*]     return maxMemory - totalMemory + freeMemory;  
[*] }  

 计算jvm空余内存的方法值得注意一下:由于JVM可以使用-Xms 和-Xmx 指定启动内存和最大内存,所以计算空余内存的时候,需要考虑到JVM可以分配的最大内存(runtime.maxMemory())和当前可使用的最大内存(runtime.totalMemory()),因此最终的free memory =当前空余内存(runtime.freeMemory())  + 可以分配但还没有分配的内存(runtime.maxMemory() - runtime.totalMemory())
 
--EOF--
页: [1]
查看完整版本: 【转】Resin关于最小内存设置