?? cmsmemorymonitor.java
字號:
} 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 value sizes of value objects within the monitored object.<p>
* obj must be of type map
*
* @param obj the object
* @return the value sizes of value objects or "-"-fields
*/
private long getValueSize(Object obj) {
if (obj instanceof CmsLruCache) {
return ((CmsLruCache)obj).size();
}
if (obj instanceof Map) {
return getValueSize((Map)obj, 1);
}
if (obj instanceof List) {
return getValueSize((List)obj, 1);
}
try {
return getMemorySize(obj);
} catch (Exception exc) {
return 0;
}
}
/**
* Sends a warning or status email with OpenCms Memory information.<p>
*
* @param warning if true, send a memory warning email
*/
private void monitorSendEmail(boolean warning) {
if ((m_configuration.getEmailSender() == null) || (m_configuration.getEmailReceiver() == null)) {
// send no mails if not fully configured
return;
} else if (warning
&& (m_warningSendSinceLastStatus && !((m_intervalEmail <= 0) && (System.currentTimeMillis() < (m_lastEmailWarning + m_intervalWarning))))) {
// send no warning email if no status email has been send since the last warning
// if status is disabled, send no warn email if warn interval has not passed
return;
} else if ((!warning) && (m_intervalEmail <= 0)) {
// if email iterval is <= 0 status email is disabled
return;
}
String date = CmsDateUtil.getDateTimeShort(System.currentTimeMillis());
String subject;
String content = "";
if (warning) {
m_warningSendSinceLastStatus = true;
m_lastEmailWarning = System.currentTimeMillis();
subject = "OpenCms Memory W A R N I N G ["
+ OpenCms.getSystemInfo().getServerName().toUpperCase()
+ "/"
+ date
+ "]";
content += "W A R N I N G !\nOpenCms memory consumption on server "
+ OpenCms.getSystemInfo().getServerName().toUpperCase()
+ " has reached a critical level !\n\n"
+ "The configured limit is "
+ m_maxUsagePercent
+ "%\n\n";
} else {
m_warningSendSinceLastStatus = false;
m_lastEmailStatus = System.currentTimeMillis();
subject = "OpenCms Memory Status ["
+ OpenCms.getSystemInfo().getServerName().toUpperCase()
+ "/"
+ date
+ "]";
}
content += "Memory usage report of OpenCms server "
+ OpenCms.getSystemInfo().getServerName().toUpperCase()
+ " at "
+ date
+ "\n\n"
+ "Memory maximum heap size: "
+ m_memoryCurrent.getMaxMemory()
+ " mb\n"
+ "Memory current heap size: "
+ m_memoryCurrent.getTotalMemory()
+ " mb\n\n"
+ "Memory currently used : "
+ m_memoryCurrent.getUsedMemory()
+ " mb ("
+ m_memoryCurrent.getUsage()
+ "%)\n"
+ "Memory currently unused : "
+ m_memoryCurrent.getFreeMemory()
+ " mb\n\n\n";
if (warning) {
content += "*** Please take action NOW to ensure that no OutOfMemoryException occurs.\n\n\n";
}
CmsSessionManager sm = OpenCms.getSessionManager();
if (sm != null) {
content += "Current status of the sessions:\n\n";
content += "Logged in users : " + sm.getSessionCountAuthenticated() + "\n";
content += "Currently active sessions: " + sm.getSessionCountCurrent() + "\n";
content += "Total created sessions : " + sm.getSessionCountTotal() + "\n\n\n";
}
sm = null;
content += "Current status of the caches:\n\n";
List keyList = Arrays.asList(m_monitoredObjects.keySet().toArray());
Collections.sort(keyList);
long totalSize = 0;
for (Iterator keys = keyList.iterator(); keys.hasNext();) {
String key = (String)keys.next();
String[] shortKeys = key.split("\\.");
String shortKey = shortKeys[shortKeys.length - 2] + '.' + shortKeys[shortKeys.length - 1];
PrintfFormat form = new PrintfFormat("%9s");
Object obj = m_monitoredObjects.get(key);
long size = getKeySize(obj) + getValueSize(obj) + getCosts(obj);
totalSize += size;
content += new PrintfFormat("%-42.42s").sprintf(shortKey)
+ " "
+ "Entries: "
+ form.sprintf(getItems(obj))
+ " "
+ "Limit: "
+ form.sprintf(getLimit(obj))
+ " "
+ "Size: "
+ form.sprintf(Long.toString(size))
+ "\n";
}
content += "\nTotal size of cache memory monitored: " + totalSize + " (" + totalSize / 1048576 + ")\n\n";
String from = m_configuration.getEmailSender();
List receivers = new ArrayList();
List receiverEmails = m_configuration.getEmailReceiver();
try {
if (from != null && receiverEmails != null && !receiverEmails.isEmpty()) {
Iterator i = receiverEmails.iterator();
while (i.hasNext()) {
receivers.add(new InternetAddress((String)i.next()));
}
CmsSimpleMail email = new CmsSimpleMail();
email.setFrom(from);
email.setTo(receivers);
email.setSubject(subject);
email.setMsg(content);
new CmsMailTransport(email).send();
}
if (LOG.isInfoEnabled()) {
if (warning) {
LOG.info(Messages.get().getBundle().key(Messages.LOG_MM_WARNING_EMAIL_SENT_0));
} else {
LOG.info(Messages.get().getBundle().key(Messages.LOG_MM_STATUS_EMAIL_SENT_0));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Write a warning or status log entry with OpenCms Memory information.<p>
*
* @param warning if true, write a memory warning log entry
*/
private void monitorWriteLog(boolean warning) {
if (!LOG.isWarnEnabled()) {
// we need at last warn level for this output
return;
} else if ((!warning) && (!LOG.isInfoEnabled())) {
// if not warning we need info level
return;
} else if (warning
&& (m_warningLoggedSinceLastStatus && !(((m_intervalLog <= 0) && (System.currentTimeMillis() < (m_lastLogWarning + m_intervalWarning)))))) {
// write no warning log if no status log has been written since the last warning
// if status is disabled, log no warn entry if warn interval has not passed
return;
} else if ((!warning) && (m_intervalLog <= 0)) {
// if log iterval is <= 0 status log is disabled
return;
}
if (warning) {
m_lastLogWarning = System.currentTimeMillis();
m_warningLoggedSinceLastStatus = true;
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_MM_WARNING_MEM_CONSUME_2,
new Long(m_memoryCurrent.getUsage()),
new Integer(m_maxUsagePercent)));
} else {
m_warningLoggedSinceLastStatus = false;
m_lastLogStatus = System.currentTimeMillis();
}
if (warning) {
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_MM_WARNING_MEM_STATUS_6,
new Object[] {
new Long(m_memoryCurrent.getMaxMemory()),
new Long(m_memoryCurrent.getTotalMemory()),
new Long(m_memoryCurrent.getFreeMemory()),
new Long(m_memoryCurrent.getUsedMemory()),
new Long(m_memoryCurrent.getUsage()),
new Integer(m_maxUsagePercent)}));
} else {
m_logCount++;
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_LOG_INFO_2,
OpenCms.getSystemInfo().getServerName().toUpperCase(),
String.valueOf(m_logCount)));
List keyList = Arrays.asList(m_monitoredObjects.keySet().toArray());
Collections.sort(keyList);
long totalSize = 0;
for (Iterator keys = keyList.iterator(); keys.hasNext();) {
String key = (String)keys.next();
Object obj = m_monitoredObjects.get(key);
long size = getKeySize(obj) + getValueSize(obj) + getCosts(obj);
totalSize += size;
PrintfFormat name1 = new PrintfFormat("%-80s");
PrintfFormat name2 = new PrintfFormat("%-50s");
PrintfFormat form = new PrintfFormat("%9s");
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_NOWARN_STATUS_5,
new Object[] {
name1.sprintf(key),
name2.sprintf(obj.getClass().getName()),
form.sprintf(getItems(obj)),
form.sprintf(getLimit(obj)),
form.sprintf(Long.toString(size))}));
}
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_WARNING_MEM_STATUS_6,
new Object[] {
new Long(m_memoryCurrent.getMaxMemory()),
new Long(m_memoryCurrent.getTotalMemory()),
new Long(m_memoryCurrent.getFreeMemory()),
new Long(m_memoryCurrent.getUsedMemory()),
new Long(m_memoryCurrent.getUsage()),
new Integer(m_maxUsagePercent),
new Long(totalSize),
new Long(totalSize / 1048576)})
);
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_WARNING_MEM_STATUS_AVG_6,
new Object[] {
new Long(m_memoryAverage.getMaxMemory()),
new Long(m_memoryAverage.getTotalMemory()),
new Long(m_memoryAverage.getFreeMemory()),
new Long(m_memoryAverage.getUsedMemory()),
new Long(m_memoryAverage.getUsage()),
new Integer(m_memoryAverage.getCount())}));
CmsSessionManager sm = OpenCms.getSessionManager();
if (sm != null) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_SESSION_STAT_3,
String.valueOf(sm.getSessionCountAuthenticated()),
String.valueOf(sm.getSessionCountCurrent()),
String.valueOf(sm.getSessionCountTotal())));
}
sm = null;
for (Iterator i = OpenCms.getSqlManager().getDbPoolNames().iterator(); i.hasNext();) {
String poolname = (String)i.next();
try {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_CONNECTIONS_3,
poolname,
Integer.toString(OpenCms.getSqlManager().getActiveConnections(poolname)),
Integer.toString(OpenCms.getSqlManager().getIdleConnections(poolname))));
} catch (Exception exc) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_CONNECTIONS_3,
poolname,
Integer.toString(-1),
Integer.toString(-1)));
}
}
LOG.info(Messages.get().getBundle().key(
Messages.LOG_MM_STARTUP_TIME_2,
CmsDateUtil.getDateTimeShort(OpenCms.getSystemInfo().getStartupTime()),
CmsStringUtil.formatRuntime(OpenCms.getSystemInfo().getRuntime())));
}
}
/**
* Updatres the memory information of the memory monitor.<p>
*/
private void updateStatus() {
m_memoryCurrent.update();
m_memoryAverage.calculateAverage(m_memoryCurrent);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -