【问题标题】:JSF 2 Spring XRebel Huge sessionJSF 2 Spring XRebel 大型会议
【发布时间】:2014-10-17 19:24:32
【问题描述】:

我最近安装了 XRebel 插件,它允许您查看当前会话大小。

我发现,第一页加载时会话立即达到 10 mb(身份验证会话 bean 的初始化。)。

我的设置:

我正在使用 JSF 2.2、Spring 4 和 Hibernate 4。

DAO 层 > 服务层 > 托管 Bean

DAO 层

@Named
@Singleton
@Repository
public class UserDao extends BaseDao<User>
{
...
}

服务层

@Service
@Named
@Singleton
public class UserService extends BaseService<User>
{


    @Autowired
    private UserDao dao;

...

}

我的身份验证会话 bean,在第一页加载时加载

@Named
@Component
@Scope("session")
public class Auth implements Serializable
{

    @Autowired
    private UserService userService;

    ...
}

在我正在使用的 applicationContext.xml 中

<context:component-scan base-package="com.mypackage" />

这是我在会话 bean 中自动装配服务 bean 时遇到的一般问题。

Userservice 仅包含检索、保存和删除用户对象的方法,没有包含用户或其他任何内容的 ArrayList。

我的 auth bean 中有两个 @Autowired 服务 - UserService 和 SessionService。

如果我注释掉 UserService,SessionService 将达到相同的大小。如果我将两者都注释掉,则“org.springframework.web.context.request.ServletRequestAttribute...”中的“DestructionCallbackBindingListener”会立即达到 8mb。

我做错了什么?如何减小会话大小?

我很乐意接受任何帮助。

这是一张 XRebel 的图片,显示 userService 在会话中占用大约 8mb 大小。 http://i.stack.imgur.com/TBXx3.png

看XRebel,好像beanFactory是保存在用户会话中的。

【问题讨论】:

    标签: java spring jsf session


    【解决方案1】:

    我在官方论坛上发布了有关 XRebel 的信息。这是我收到的答案。

    确实,beanFactory 是可访问的,从会话,通过 CGLIB 代理。我们可能需要改进识别物体的方式 共享或不应被视为会话的一部分。

    我们尝试显示每个会话占用多少内存,但 Spring beanFactories 当然通常在会话之间共享。

    通常我们会从会话中过滤掉 transient 字段 已经足够了,但我们将看看 CGLIB/Spring 代理 我们如何通过一般规则过滤掉它们,或者我们可以添加 将特定的 Spring 类添加到忽略列表中。

    简而言之:在查看会话大小时可以忽略 beanfactory,如果可能的话,可以选择标记自动装配服务瞬态。

    确实,您现在可以在精神上忽略它,或者如果可能的话 是的,使变量瞬态会排除它们。

    【讨论】:

    • 仅供参考,虽然会话中的共享对象与内存泄漏无关,但如果您的会话被序列化,它们仍然会产生大量开销,除非它们使用 writeReplace() 或类似方法。
    • 有没有办法让我强制执行,或者这一切都与 spring 相关,我无需为此做任何事情?
    • 目前,什么都做不了,但期待该工具的下一个版本会有所改进。
    猜你喜欢
    • 2013-09-02
    • 2011-07-03
    • 1970-01-01
    • 2015-01-28
    • 2015-06-29
    • 1970-01-01
    • 2011-10-16
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多