?? cmsmemorymonitor.java
字號:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/monitor/CmsMemoryMonitor.java,v $
* Date : $Date: 2006/03/27 14:53:04 $
* Version: $Revision: 1.58 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.monitor;
import org.opencms.cache.CmsLruCache;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsGroup;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsUser;
import org.opencms.flex.CmsFlexCache.CmsFlexCacheVariation;
import org.opencms.mail.CmsMailTransport;
import org.opencms.mail.CmsSimpleMail;
import org.opencms.main.CmsEvent;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsSessionManager;
import org.opencms.main.I_CmsEventListener;
import org.opencms.main.OpenCms;
import org.opencms.scheduler.I_CmsScheduledJob;
import org.opencms.security.CmsAccessControlList;
import org.opencms.security.CmsPermissionSet;
import org.opencms.util.CmsDateUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.util.PrintfFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.mail.internet.InternetAddress;
import org.apache.commons.collections.map.LRUMap;
import org.apache.commons.logging.Log;
/**
* Monitors OpenCms memory consumtion.<p>
*
* @author Carsten Weinholz
* @author Michael Emmerich
* @author Alexander Kandzior
*
* @version $Revision: 1.58 $
*
* @since 6.0.0
*/
public class CmsMemoryMonitor implements I_CmsScheduledJob {
/** Set interval for clearing the caches to 10 minutes. */
private static final int INTERVAL_CLEAR = 1000 * 60 * 10;
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsMemoryMonitor.class);
/** Flag indicating if monitor is currently running. */
private static boolean m_currentlyRunning;
/** Maximum depth for object size recursion. */
private static final int MAX_DEPTH = 5;
/** The memory monitor configuration. */
private CmsMemoryMonitorConfiguration m_configuration;
/** Interval in which emails are send. */
private int m_intervalEmail;
/** Interval in which the log is written. */
private int m_intervalLog;
/** Interval between 2 warnings. */
private int m_intervalWarning;
/** The time the caches were last cleared. */
private long m_lastClearCache;
/** The time the last status email was send. */
private long m_lastEmailStatus;
/** The time the last warning email was send. */
private long m_lastEmailWarning;
/** The time the last status log was written. */
private long m_lastLogStatus;
/** The time the last warning log was written. */
private long m_lastLogWarning;
/** The number of times the log entry was written. */
private int m_logCount;
/** Memory percentage to reach to go to warning level. */
private int m_maxUsagePercent;
/** The average memory status. */
private CmsMemoryStatus m_memoryAverage;
/** The current memory status. */
private CmsMemoryStatus m_memoryCurrent;
/** Contains the object to be monitored. */
private Map m_monitoredObjects;
/** Flag for memory warning mail send. */
private boolean m_warningLoggedSinceLastStatus;
/** Flag for memory warning mail send. */
private boolean m_warningSendSinceLastStatus;
/**
* Empty constructor, required by OpenCms scheduler.<p>
*/
public CmsMemoryMonitor() {
m_monitoredObjects = new HashMap();
}
/**
* Returns the size of objects that are instances of
* <code>byte[]</code>, <code>String</code>, <code>CmsFile</code>,<code>I_CmsLruCacheObject</code>.<p>
* For other objects, a size of 0 is returned.
*
* @param obj the object
* @return the size of the object
*/
public static int getMemorySize(Object obj) {
if (obj instanceof I_CmsMemoryMonitorable) {
return ((I_CmsMemoryMonitorable)obj).getMemorySize();
}
if (obj instanceof byte[]) {
// will always be a total of 16 + 8
return 8 + (int)(Math.ceil(((byte[])obj).length / 16.0) * 16.0);
}
if (obj instanceof String) {
// will always be a total of 16 + 24
return 24 + (int)(Math.ceil(((String)obj).length() / 8.0) * 16.0);
}
if (obj instanceof CmsFile) {
CmsFile f = (CmsFile)obj;
if (f.getContents() != null) {
return f.getContents().length + 1024;
} else {
return 1024;
}
}
if (obj instanceof CmsUUID) {
return 184; // worst case if UUID String has been generated
}
if (obj instanceof CmsPermissionSet) {
return 16; // two ints
}
if (obj instanceof CmsResource) {
return 1024; // estimated size
}
if (obj instanceof CmsUser) {
return 2048; // estimated size
}
if (obj instanceof CmsGroup) {
return 512; // estimated size
}
if (obj instanceof CmsProject) {
return 512;
}
if (obj instanceof Boolean) {
return 8; // one boolean
}
if (obj instanceof CmsProperty) {
int size = 8;
CmsProperty property = (CmsProperty)obj;
size += getMemorySize(property.getName());
if (property.getResourceValue() != null) {
size += getMemorySize(property.getResourceValue());
}
if (property.getStructureValue() != null) {
size += getMemorySize(property.getStructureValue());
}
return size;
}
if (obj instanceof CmsPropertyDefinition) {
int size = 8;
CmsPropertyDefinition propDef = (CmsPropertyDefinition)obj;
size += getMemorySize(propDef.getName());
size += getMemorySize(propDef.getId());
return size;
}
// System.err.println("Unresolved: " + obj.getClass().getName());
return 8;
}
/**
* Returns if monitoring is enabled.<p>
*
* @return true if monitoring is enabled
*/
public boolean enabled() {
return true;
}
/**
* Returns the configuration.<p>
*
* @return the configuration
*/
public CmsMemoryMonitorConfiguration getConfiguration() {
return m_configuration;
}
/**
* Returns the log count.<p>
*
* @return the log count
*/
public int getLogCount() {
return m_logCount;
}
/**
* Initializes the monitor with the provided configuration.<p>
*
* @param configuration the configuration to use
*/
public void initialize(CmsMemoryMonitorConfiguration configuration) {
m_memoryAverage = new CmsMemoryStatus();
m_memoryCurrent = new CmsMemoryStatus();
m_warningSendSinceLastStatus = false;
m_warningLoggedSinceLastStatus = false;
m_lastEmailWarning = 0;
m_lastEmailStatus = 0;
m_lastLogStatus = 0;
m_lastLogWarning = 0;
m_lastClearCache = 0;
m_configuration = configuration;
m_intervalWarning = 720 * 60000;
m_maxUsagePercent = 90;
m_intervalEmail = m_configuration.getEmailInterval() * 1000;
m_intervalLog = m_configuration.getLogInterval() * 1000;
if (m_configuration.getWarningInterval() > 0) {
m_intervalWarning = m_configuration.getWarningInterval();
}
m_intervalWarning *= 1000;
if (m_configuration.getMaxUsagePercent() > 0) {
m_maxUsagePercent = m_configuration.getMaxUsagePercent();
}
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_INTERVAL_LOG_1,
new Integer(m_intervalLog / 1000)));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_INTERVAL_EMAIL_1,
new Integer(m_intervalEmail / 1000)));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.LOG_MM_INTERVAL_WARNING_1,
new Integer(m_intervalWarning / 1000)));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -