?? cmsmemorymonitor.java
字號(hào):
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_INTERVAL_MAX_USAGE_1,
new Integer(m_intervalWarning / 1000)));
if ((m_configuration.getEmailReceiver() == null) || (m_configuration.getEmailSender() == null)) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.LOG_MM_EMAIL_DISABLED_0));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_EMAIL_SENDER_1,
m_configuration.getEmailSender()));
Iterator i = m_configuration.getEmailReceiver().iterator();
int n = 0;
while (i.hasNext()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_EMAIL_RECEIVER_2,
new Integer(n + 1),
i.next()));
n++;
}
}
}
if (LOG.isDebugEnabled()) {
// this will happen only once during system startup
LOG.debug(Messages.get().getBundle().key(Messages.LOG_MM_CREATED_1, new Date(System.currentTimeMillis())));
}
}
/**
* @see org.opencms.scheduler.I_CmsScheduledJob#launch(CmsObject, Map)
*/
public String launch(CmsObject cms, Map parameters) throws Exception {
CmsMemoryMonitor monitor = OpenCms.getMemoryMonitor();
// make sure job is not launched twice
if (m_currentlyRunning) {
return null;
}
try {
m_currentlyRunning = true;
// update the memory status
monitor.updateStatus();
// check if the system is in a low memory condition
if (monitor.lowMemory()) {
// log warning
monitor.monitorWriteLog(true);
// send warning email
monitor.monitorSendEmail(true);
// clean up caches
monitor.clearCaches();
}
// check if regular a log entry must be written
if ((System.currentTimeMillis() - monitor.m_lastLogStatus) > monitor.m_intervalLog) {
monitor.monitorWriteLog(false);
}
// check if the memory status email must be send
if ((System.currentTimeMillis() - monitor.m_lastEmailStatus) > monitor.m_intervalEmail) {
monitor.monitorSendEmail(false);
}
} finally {
// make sure state is reset even if an error occurs,
// otherwise MM will not be executed after an error
m_currentlyRunning = false;
}
return null;
}
/**
* Returns true if the system runs low on memory.<p>
*
* @return true if the system runs low on memory
*/
public boolean lowMemory() {
return ((m_maxUsagePercent > 0) && (m_memoryCurrent.getUsage() > m_maxUsagePercent));
}
/**
* Adds a new object to the monitor.<p>
*
* @param objectName name of the object
* @param object the object for monitoring
*/
public void register(String objectName, Object object) {
m_monitoredObjects.put(objectName, object);
}
/**
* Clears the OpenCms caches.<p>
*/
private void clearCaches() {
if ((m_lastClearCache + INTERVAL_CLEAR) > System.currentTimeMillis()) {
// if the cache has already been cleared less then 15 minutes ago we skip this because
// clearing the caches to often will hurt system performance and the
// setup seems to be in trouble anyway
return;
}
m_lastClearCache = System.currentTimeMillis();
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_CLEAR_CACHE_MEM_CONS_0));
}
OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_CLEAR_CACHES, Collections.EMPTY_MAP));
System.gc();
}
/**
* Returns the cache costs of a monitored object.<p>
* obj must be of type CmsLruCache
*
* @param obj the object
* @return the cache costs or "-"
*/
private long getCosts(Object obj) {
long costs = 0;
if (obj instanceof CmsLruCache) {
costs = ((CmsLruCache)obj).getObjectCosts();
if (costs < 0) {
costs = 0;
}
}
return costs;
}
/**
* Returns the number of items within a monitored object.<p>
* obj must be of type CmsLruCache, CmsLruHashMap or Map
*
* @param obj the object
* @return the number of items or "-"
*/
private String getItems(Object obj) {
if (obj instanceof CmsLruCache) {
return Integer.toString(((CmsLruCache)obj).size());
}
if (obj instanceof Map) {
return Integer.toString(((Map)obj).size());
}
return "-";
}
/**
* Returns the total size of key strings within a monitored map.<p>
* the keys must be of type String.
*
* @param map the map
* @param depth the max recursion depth for calculation the size
* @return total size of key strings
*/
private long getKeySize(Map map, int depth) {
long keySize = 0;
try {
Object[] values = map.values().toArray();
for (int i = 0, s = values.length; i < s; i++) {
Object obj = values[i];
if (obj instanceof Map && depth < MAX_DEPTH) {
keySize += getKeySize((Map)obj, depth + 1);
continue;
}
}
values = null;
Object[] keys = map.keySet().toArray();
for (int i = 0, s = keys.length; i < s; i++) {
Object obj = keys[i];
if (obj instanceof String) {
String st = (String)obj;
keySize += (st.length() * 2);
}
}
} catch (ConcurrentModificationException e) {
// this might happen since even the .toArray() method internally creates an iterator
} catch (Throwable t) {
// catch all other exceptions otherwise the whole monitor will stop working
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_CAUGHT_THROWABLE_1, t.getMessage()));
}
}
return keySize;
}
/**
* Returns the total size of key strings within a monitored object.<p>
* obj must be of type map, the keys must be of type String.
*
* @param obj the object
* @return the total size of key strings
*/
private long getKeySize(Object obj) {
if (obj instanceof Map) {
return getKeySize((Map)obj, 1);
}
return 0;
}
/**
* Returns the max costs for all items within a monitored object.<p>
* obj must be of type CmsLruCache, CmsLruHashMap
*
* @param obj the object
* @return max cost limit or "-"
*/
private String getLimit(Object obj) {
if (obj instanceof CmsLruCache) {
return Integer.toString(((CmsLruCache)obj).getMaxCacheCosts());
}
if (obj instanceof LRUMap) {
return Integer.toString(((LRUMap)obj).maxSize());
}
return "-";
}
/**
* Returns the total value size of a list object.<p>
*
* @param listValue the list object
* @param depth the max recursion depth for calculation the size
* @return the size of the list object
*/
private long getValueSize(List listValue, int depth) {
long totalSize = 0;
try {
Object[] values = listValue.toArray();
for (int i = 0, s = values.length; i < s; i++) {
Object obj = values[i];
if (obj instanceof CmsAccessControlList) {
obj = ((CmsAccessControlList)obj).getPermissionMap();
}
if (obj instanceof CmsFlexCacheVariation) {
obj = ((CmsFlexCacheVariation)obj).m_map;
}
if (obj instanceof Map && depth < MAX_DEPTH) {
totalSize += getValueSize((Map)obj, depth + 1);
continue;
}
if (obj instanceof List && depth < MAX_DEPTH) {
totalSize += getValueSize((List)obj, depth + 1);
continue;
}
totalSize += getMemorySize(obj);
}
} catch (ConcurrentModificationException e) {
// this might happen since even the .toArray() method internally creates an iterator
} catch (Throwable t) {
// catch all other exceptions otherwise the whole monitor will stop working
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_CAUGHT_THROWABLE_1, t.getMessage()));
}
}
return totalSize;
}
/**
* Returns the total value size of a map object.<p>
*
* @param mapValue the map object
* @param depth the max recursion depth for calculation the size
* @return the size of the map object
*/
private long getValueSize(Map mapValue, int depth) {
long totalSize = 0;
try {
Object[] values = mapValue.values().toArray();
for (int i = 0, s = values.length; i < s; i++) {
Object obj = values[i];
if (obj instanceof CmsAccessControlList) {
obj = ((CmsAccessControlList)obj).getPermissionMap();
}
if (obj instanceof CmsFlexCacheVariation) {
obj = ((CmsFlexCacheVariation)obj).m_map;
}
if (obj instanceof Map && depth < MAX_DEPTH) {
totalSize += getValueSize((Map)obj, depth + 1);
continue;
}
if (obj instanceof List && depth < MAX_DEPTH) {
totalSize += getValueSize((List)obj, depth + 1);
continue;
}
totalSize += getMemorySize(obj);
}
} catch (ConcurrentModificationException e) {
// this might happen since even the .toArray() method internally creates an iterator
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -