【问题标题】:Java Maven Tomcat7:run java memory options for jvmJava Maven Tomcat7:为 jvm 运行 java 内存选项
【发布时间】:2013-11-22 12:20:59
【问题描述】:

我的问题对我来说很复杂。我正在为游戏运行服务器,但在正确设置内存的 java 设置时遇到了一些问题。

我正在运行 Ubuntu 12.10 64 位和 32 GB 内存。

java 任务最多应占用 20 GB 的实际内存。它没有这样做,而是一直使用虚拟内存。

top - 19:51:44 up 15 min,  1 user,  load average: 0.29, 0.30, 0.19
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.9%us,  0.3%sy,  0.0%ni, 98.5%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32809368k total,  2237888k used, 30571480k free,    28092k buffers
Swap: 16776116k total,        0k used, 16776116k free,   411660k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1876 test      20   0 46.1g 1.2g  15m S    8  3.7   1:37.17 java

目前我正在使用以下命令运行它: MAVEN_OPTS="-Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -Xmx20480M" 屏幕 -S 测试 -d -m mvn -o tomcat7:run

我也尝试将其添加到 pom.xml(构建选择):

    <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <argLine>-Xmx20480m</argLine>
                <mainClass>org.server.Server</mainClass>
                <arguments>
                </arguments>
            </configuration>
        </plugin>

如果有人知道这个问题的解决方案,那就太好了。

非常感谢。

编辑:/proc/{pid}/ls -l 我不能直接回答你的评论,但我不明白这个 mmap 到底在哪里。 这就是我切换到你写的文件夹时得到的:

    root@testserver /proc/1876 # ls -l
    total 0
    dr-xr-xr-x   2 root root 0 Nov 10 20:15 attr
    -rw-r--r--   1 root root 0 Nov 10 20:15 autogroup
    -r--------   1 root root 0 Nov 10 20:15 auxv
    -r--r--r--   1 root root 0 Nov 10 20:15 cgroup
    --w-------   1 root root 0 Nov 10 20:15 clear_refs
    -r--r--r--   1 root root 0 Nov 10 20:15 cmdline
    -rw-r--r--   1 root root 0 Nov 10 20:15 comm
    -rw-r--r--   1 root root 0 Nov 10 19:37 coredump_filter
    -r--r--r--   1 root root 0 Nov 10 20:15 cpuset
    lrwxrwxrwx   1 root root 0 Nov 10 19:39 cwd -> /srv/main
    -r--------   1 root root 0 Nov 10 20:15 environ
    lrwxrwxrwx   1 root root 0 Nov 10 19:37 exe -> /usr/lib/jvm/java-7-oracle/bin/java
    dr-x------   2 root root 0 Nov 10 19:39 fd
    dr-x------   2 root root 0 Nov 10 20:15 fdinfo
    -r--------   1 root root 0 Nov 10 20:15 io
    -r--r--r--   1 root root 0 Nov 10 20:15 latency
    -r--r--r--   1 root root 0 Nov 10 20:15 limits
    -rw-r--r--   1 root root 0 Nov 10 20:15 loginuid
    dr-x------   2 root root 0 Nov 10 20:15 map_files
    -r--r--r--   1 root root 0 Nov 10 19:37 maps
    -rw-------   1 root root 0 Nov 10 20:15 mem
    -r--r--r--   1 root root 0 Nov 10 20:15 mountinfo
    -r--r--r--   1 root root 0 Nov 10 20:15 mounts
    -r--------   1 root root 0 Nov 10 20:15 mountstats
    dr-xr-xr-x   5 root root 0 Nov 10 19:37 net
    dr-x--x--x   2 root root 0 Nov 10 20:15 ns
    -r--r--r--   1 root root 0 Nov 10 20:15 numa_maps
    -rw-r--r--   1 root root 0 Nov 10 20:15 oom_adj
    -r--r--r--   1 root root 0 Nov 10 20:15 oom_score
    -rw-r--r--   1 root root 0 Nov 10 20:15 oom_score_adj
    -r--r--r--   1 root root 0 Nov 10 20:15 pagemap
    -r--r--r--   1 root root 0 Nov 10 20:15 personality
    lrwxrwxrwx   1 root root 0 Nov 10 19:39 root -> /
    -rw-r--r--   1 root root 0 Nov 10 20:15 sched
    -r--r--r--   1 root root 0 Nov 10 20:15 schedstat
    -r--r--r--   1 root root 0 Nov 10 20:15 sessionid
    -r--r--r--   1 root root 0 Nov 10 20:15 smaps
    -r--r--r--   1 root root 0 Nov 10 20:15 stack
    -r--r--r--   1 root root 0 Nov 10 19:37 stat
    -r--r--r--   1 root root 0 Nov 10 19:37 statm
    -r--r--r--   1 root root 0 Nov 10 20:15 status
    -r--r--r--   1 root root 0 Nov 10 20:15 syscall
    dr-xr-xr-x 627 root root 0 Nov 10 20:15 task
    -r--r--r--   1 root root 0 Nov 10 20:15 wchan

编辑 2: 地图文件:https://drive.google.com/file/d/0BxN3fm0mPOMUMVF1X0VEc2NSWVU/edit?usp=sharing

【问题讨论】:

  • 为什么你认为它应该使用 20GB?您的程序是否分配了那么多内存?如果是这样,你为什么认为它应该被交换?程序是否触及了所有的记忆?
  • 以防万一,20GB 堆对于现代 GC 收集器来说意味着数十秒的停顿时间。

标签: java tomcat memory jvm


【解决方案1】:

您需要弄清楚额外虚拟内存的来源。堆不是唯一使用的内存,而是 JVM 或您的应用程序。

我建议您查看/proc/{pid}/maps 以查看虚拟内存是来自内存映射文件、线程堆栈还是本机内存。

你有多少线程,因为它们可以贡献很多(如果你有数千个)

如果您有内存映射文件,这很可能是数百 GB 的虚拟内存。鉴于您的整个系统实际上使用了 2 GB 内存,我会怀疑大型内存映射,因为这些映射通常使用大量虚拟内存而不使用读取内存。您应该可以在 maps 中轻松看到这一点,因为它包含每个内存映射文件的路径。

这是一个可用于解码映射的程序。运行它

java -cp . Main /proc/{pid}/maps

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(args[0]));
        List<Mapping> mappings = new ArrayList<>();
        for (String line; (line = br.readLine()) != null; ) {
            mappings.add(new Mapping(line));
        }
        Collections.sort(mappings);
        for (Mapping mapping : mappings) {
            System.out.println(mapping);
        }
    }

    static class Mapping implements Comparable<Mapping> {
        final String details;
        final long size;

        Mapping(String details) {
            this.details = details;
            String[] words = details.split("[- ]");
            long size = 0;
            try {
                if (words.length > 2)
                size = new BigInteger(words[1], 16).longValue() - new BigInteger(words[0], 16).longValue();
            } catch (NumberFormatException e) {
                // ignored.
            }
            this.size = size;
        }

        @Override
        public int compareTo(Mapping o) {
            // reverse order.
            return -Long.compare(size, o.size);
        }

        @Override
        public String toString() {
            return String.format("%.3f %s", size / 1024.0 / 1024, details);
        }
    }
}

【讨论】:

  • 我已经用 /proc/{pid} ls -l 编辑了我的问题,没有 mmap 的东西。
  • @user2976847 抱歉,应该是maps
  • 随着时间的推移,服务器开始越来越滞后。我不知道为什么。我们没有太多可能导致 40 GB 虚拟内存的数据文件。服务器数据文件最大为 10 mb。
  • @user2976847 能否提供您的maps 的副本?也许您使用的比您想象的要多,或者多次映射相同的文件。顺便说一句,gb = 克位和mb = 毫位。
  • 命令行说:/usr/lib/jvm/java-7-oracle/bin/java.-Xmx20480M.-XX:MaxPermSize=20480M.-classpath./usr/share/maven/boot /plexus-classworlds-2.x.jar.-Dclassworlds.conf=/usr/share/maven/bin/m2.conf.-Dmaven.home=/usr/share/maven.org.codehaus.plexus.classworlds.launcher .Launcher.-o.tomcat7:run.
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 2012-09-05
  • 2013-07-27
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多