首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在任意时间点使用Tomcat中的所有HttpSessions测量内存消耗

问在任意时间点使用Tomcat中的所有HttpSessions测量内存消耗
EN

Stack Overflow用户
提问于 2022-05-30 16:44:25
回答 1查看 76关注 0票数 1

我想测量HttpSession在web应用程序中使用的内存百分比。

有没有任何方法可以在不修改应用程序的情况下,在运行Tomcat实例的任意时间点使用所有HttpSession来测量内存消耗?

我试过的

  • 在Tomcat中,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测量内存消耗。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-26 15:50:33

根据@LMC的评论,我用JMX:https://github.com/satob/SessionSize制作了一个示例项目,以获得HttpSession的大小。

请注意,由于不能直接访问org.apache.catalina.session.ManagerBase,因此该项目使用ByteMan。使用Byteman将ManagerBase对象存储到MBean SessionMonitor的静态字段,如下所示:

代码语言:javascript
复制
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接口中使用它,如:

代码语言:javascript
复制
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;
    }
}

​

​

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72437618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档