[英]Java Maven Tomcat7:run java memory options for jvm
我的問題對我來說很復雜。 我正在運行用於游戲的服務器,但在正確設置內存的Java設置時遇到一些問題。
我正在使用32 GB RAM運行Ubuntu 12.10 64位。
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
您需要確定多余的虛擬內存來自何處。 堆不是唯一使用的內存,而是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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.