【问题标题】:Is there any performance impact of using slf4j with spring mvc?将 slf4j 与 spring mvc 一起使用是否会对性能产生影响?
【发布时间】:2012-10-01 20:42:03
【问题描述】:

从一个示例应用程序中,他们使用 slf4j,并且依赖关系的范围是运行时。

这样做是否会对性能产生任何影响,或者这是应用程序启动期间的一次性命中?

            <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>runtime</scope>
        </dependency>

我相信 spring 和 log4j 存在一些内存泄漏,因为每当我在开发过程中使用 jetty 运行我的应用程序时,如果它在发生更改时每 10 秒重新加载一次,它最终会给我一个 OOM 错误(permgen?)几个周期后,我被告知这是因为弹簧采伐。

评论?

【问题讨论】:

  • 因为每当我在开发过程中使用 jetty 运行我的应用程序时,如果它在发生更改时每 10 秒重新加载一次,如果您不知道,可以禁用此功能
  • wiki.eclipse.org/Jetty/Howto/Prevent_Memory_Leaks - 我们已经使用上述方法在最新版本的 jetty 中解决了许多此类问题。并不是说它会解决您的问题,这就是为什么我只发表评论......但根据发生的情况,它可能会有所帮助。
  • @mattb 什么可以禁用,如果每 x 秒有变化,则重新加载?这就是我想要的......
  • 是的。将scanIntervalSeconds 设置为 0。docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin

标签: java spring-mvc log4j jetty slf4j


【解决方案1】:

我认为性能影响并不明显,但这取决于您记录了多少,以及为记录进行了多少计算。 因此,请使用 if(logger.isDebugEnabled()) {...} 进行大量计算的日志记录

【讨论】:

    【解决方案2】:

    Spring 使用 commons-logging,最终会使用您当前的配置将其输出发送到 log4j。

    通过添加 slf4j,您并没有更改 Spring 用于内部记录的内容 - 但您添加了另一条路径,以便从您自己的 slf4j 记录器获取日志消息到 log4j。

    实际上,这种类型的事情不会真正产生任何影响(除了 commons-logging 之外还使用 slf4j,两者都发送到 log4j)因为 slf4j 或 commons-logging 本身在前面都没有真正做很多工作log4j 的 - 他们基本上只是将他们的消息发送到 log4j 以便它发送到它的附加程序。

    (但如果您总是担心性能 - 测试和测量它!)

    【讨论】:

    • 运行时的依赖范围有什么影响?
    • Maven pom.xml 中的依赖范围对于应用程序何时运行并不重要。运行时只是意味着该库不在编译类路径中,但它与您的 war 包捆绑在一起。因此,如果范围是编译或运行时,“性能影响”并不重要——在这两种情况下,JAR 都与 WAR 捆绑在一起——所以所述问题有点毫无意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多