我想测量HttpSession在web应用程序中使用的内存百分比。
有没有任何方法可以在不修改应用程序的情况下,在运行Tomcat实例的任意时间点使用所有HttpSession来测量内存消耗?
我试过的
HttpSession的具体类是org.apache.catalina.session.StandardSession。我用VisualVM描述了应用程序,并在[Profiler]-[Memory settings]中指定了org.apache.catalina.session.StandardSession。但它只显示了StandardSession本身的大小(不包括StandardSession中包含的ConcurrentHashMap的大小)。HttpSession引用的对象。SizeOf.deepSizeOf()。但是,只有在创建了新的HttpSession时,这个Byteman规则才会运行。我希望在任意时间点(例如,每30秒)用HttpSessions测量内存消耗。发布于 2022-06-26 15:50:33
根据@LMC的评论,我用JMX:https://github.com/satob/SessionSize制作了一个示例项目,以获得HttpSession的大小。
请注意,由于不能直接访问org.apache.catalina.session.ManagerBase,因此该项目使用ByteMan。使用Byteman将ManagerBase对象存储到MBean SessionMonitor的静态字段,如下所示:
RULE Set ManagerBase object to MBean
CLASS ^org.apache.catalina.session.ManagerBase
METHOD initInternal
AT EXIT
IF TRUE
DO
traceln("SETTING SessionManager");
com.example.sessionsize.SessionMonitor.setSessionManager($this);
ENDRULE并在JMX接口中使用它,如:
package com.example.sessionsize;
import org.apache.catalina.Manager;
import org.apache.catalina.Session;
import net.sourceforge.sizeof.SizeOf;
public class SessionMonitor implements SessionMonitorMBean {
private static Manager sessionManager = null;
public static void setSessionManager(Manager manager) {
sessionManager = manager;
}
@Override
public long getMemoryConsumption() {
if (sessionManager != null) {
try {
Session [] sessions = sessionManager.findSessions();
return SizeOf.deepSizeOf(sessions);
} catch(RuntimeException e) {
// Falied to get size of HttpSession object
e.printStackTrace();
return -2;
}
} else {
// SessionManager is not ready
return -1;
}
}
@Override
public long getNumberOfActiveHttpSession() {
return sessionManager.findSessions().length;
}
}

https://stackoverflow.com/questions/72437618
复制相似问题