小编Rom*_*hin的帖子

Java进程内存使用量不断增加

前提条件:

  • 具有16 Gb RAM的PC
  • 在Ubuntu 16.10 x64上安装了JDK 1.8.x.
  • 标准的基于Spring的Web应用程序,部署在Tomcat 8.5.x上.Tomcat配置了下一个参数:CATALINA_OPTS="$CATALINA_OPTS -Xms128m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -Xss512k -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxMetaspaceSize=512m -XX:-TieredCompilation -XX:ReservedCodeCacheSize=512m"
  • JMeter 2.13用于负载测试运行
  • JProfiler 9.x用于java堆内存使用情况跟踪
  • top util用于java进程内存使用情况跟踪

当我连续3次开始加载测试时,我观察(使用top)java进程增加了大量已用内存:

  • Tomcat启动后使用~1Gb
  • 在第一次测试运行后,它使用4.5Gb
  • 当所有测试完成后,Tomcat正在使用7Gb的RAM

所有这些时间堆大小都是有限的,JProfiler确认 - 堆大小不超过512Mb.

这是JProfiler的截图.底部的红色数字是java进程使用的内存大小(根据top). 在此输入图像描述

问题是:为什么java进程在工作时始终不断增加内存使用量?

谢谢!

UPD#1:关于可能的重复:他们have confirmed that this only happens on Solaris.但我使用的是Ubuntu 16.10.同样,尖锐的问题没有一个可以解释问题原因的答案.

UPD#2:暂停一段时间后我不得不回到这个问题.现在我使用pmaputil来进行java进程使用的内存转储.我有三个转储:在测试运行之前,在第一次测试执行之后和在执行一些N次测试之后.测试它们会为应用程序产生大量流量.所有转储都在这里:https://gist.github.com/proshin-roman/752cea2dc25cde64b30514ed9ed9bbd0.它们非常庞大,但最有趣的东西是第8行的堆大小:它需要282.272 Kb在测试之前,3.036.400 Kb最后 - 超过10倍的差异!每次运行测试时它都在增长.同时堆大小是恒定的(根据JProfiler/VisualVM).我有什么选择才能找到导致此问题的原因?调试JVM?我试图找到任何方法来"看"这段内存,但失败了.所以:

  • 我能以某种方式识别[heap]内存段的内容吗?
  • java的这种行为看起来如何?

我会很感激有关此问题的任何提示.谢谢大家!

UPD#3:使用jemalloc(感谢@ivan的想法)我得到了下一张图片: 在此输入图像描述

看起来我的问题与此处描述的几乎相同:http …

java memory tomcat

19
推荐指数
1
解决办法
3730
查看次数

如何在 Tomcat 上禁用从 HTTP 到 HTTPS 的自动重定向

有很多手册如何启用从 HTTP 到 HTTPS 的自动重定向。但是我需要禁用这种重定向(根据这个建议SSL 无处不在 - 一直)。我使用 Tomcat 7.x,我需要实现以下内容:

  • 所有资源都受到保护(通过 web.xml 中的配置)[完成]

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Application</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    
    Run Code Online (Sandbox Code Playgroud)
  • 当有人通过 HTTP 发出请求时 - 返回错误(我猜是 HTTP 状态 403)并且没有任何重定向

我试图删除redirectPortserver.xml已,

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"/>
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
Run Code Online (Sandbox Code Playgroud)

但它仅导致重定向到 443 端口(但我预计禁用重定向)。

所以我的问题是:如何禁用从 HTTP 到 HTTPS 的自动重定向并返回错误?

https redirect tomcat

6
推荐指数
3
解决办法
1万
查看次数

当将Optional.isPresent和Optional.get称为“不同”级别时,显示警告?

在以下代码段中,我的Foo类带有始终返回的相同实例的方法Optional。然后我有另一个OneMoreClass使用Foo类的类。

您可以从源代码中看到调用get()方法是安全的,method1因为始终在中检查该方法method2

IntelliJ IDEA仍然显示警告的问题(您只需将此代码段复制到IDEA,您将看到此问题)。

public class Example {

    public static class Foo {

        private final Optional<String> value = Optional.empty();

        public Optional<String> bar() {
            return value;
        }
    }

    public static class OneMoreClass {
        void method1(final Foo foo) {
            method2(foo);
            System.out.println(foo.bar().get()); // here the warning is shown in IntelliJ IDEA: 
                                                 // "Optional.get()" without "isPresent()" check
        }

        void method2(final Foo foo) {
            if (!foo.bar().isPresent()) {
                throw new IllegalArgumentException("No value"); …
Run Code Online (Sandbox Code Playgroud)

java intellij-idea optional java-8

1
推荐指数
1
解决办法
129
查看次数

标签 统计

java ×2

tomcat ×2

https ×1

intellij-idea ×1

java-8 ×1

memory ×1

optional ×1

redirect ×1