问大神个问题,机器4g内存,挂了一个10g的交换分区,设置tomcat 启动的jvm为-Xmx 5g,
可是启动服务后,发现-Xmx2422m
只能这么大。是不是jvm不可以走交换分区,或者是什么原因? (java linux系统均为64bit)
java应用建议禁止掉swap分区,会严重拖累jvm的。
给你建议,加入你内存4GB,CPU是2个核的。可以如下配置:
假如机器是2核的,4GB内存的,gc可以这样配置比较均衡。要求jdk8以上
-server
-Xms2048m
-Xmx2048m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-Xmn1024m
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:+CMSClassUnloadingEnabled
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/java/java.hprof
-Xloggc:/home/admin/java/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:MaxDirectMemorySize=512m
-XX:SurvivorRatio=10
-XX:+ExplicitGCInvokesConcurrent
-XX:ParallelGCThreads=2
关于swap交换分区的设置:
一种流行的、以讹传讹的说法是,安装Linux系统时,交换分区swap的大小应该是内存的两倍。也就是说,如果内存是2G,那么就应该分出4G的硬盘空间作为交换空间。其实这是严重的浪费。真实的情况是:可以根据你系统内存的大小,以及所使用的程序,自行决定交换分区的大小,甚至可以完全不用交换分区!
首先解释一下什么是交换分区。交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。
做一个假设:如果你的内存足够大,极少出现内存不足的情况,那么你就不需要交换分区。事实上,这种可能性是完全存在的。现在的1G内存的电脑不算什么了。动辄4G内存的电脑也日益普遍。日常使用的话,很少能用完全部的内存。在用不完内存容量的情况下,还要划出它两倍的硬盘空间用于内存交换,这不是浪费吗?
可以说,在你内存基本够用的情况下,完全可以不要交换空间。在Windows下也是一样,在系统属性中,把虚拟内存设置为0,系统依然运行的很好。当然,如果你用的是服务器,还是要有专门的虚拟内存,有备无患。但是虚拟内存的大小不一定非要内存的两倍。
那么怎么知道你的系统有没有用到交换空间呢?只需要在root用户下,运行下面的命令就可以知道了。
free -m
1 查看swap 空间大小(总计):
# free -m 默认单
位为k, -m 单位为M
total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572
2 查看swap 空间(file(s)/partition(s)):
包括 文件 和 分区 的详细信息
# swapon -s
等价于
# cat /proc/swaps
3 添加交换空间
两种选择:添加一个交换分区或添加一个交换文件。推荐你添加一个交换分区;不过,若你没有多少空闲空间可用,则添加交换文件。
3.1 添加一个交换分区
步骤如下:
a 使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
b 使用 mkswap 命令来设置交换分区:
# mkswap /dev/sdb2
c 启用交换分区:
# swapon /dev/sdb2
d 写入/etc/fstab,以便在引导时启用:
/dev/sdb2 swap swap defaults 0 0
3.2 添加一个交换文件
a 创建大小为512M的交换文件:
# dd if=/dev/zero of=/swapfile1 bs=1024k count=512
b 使用 mkswap 命令来设置交换文件:
# mkswap /swapfile1
c 启用交换分区:
# swapon /swapfile1
d 写入/etc/fstab,以便在引导时启用:
/swapfile1 swap swap defaults 0 0
新添了交换分区并启用它之后,请查看cat /proc/swaps
或 free 命令的输出来确保交换分区已被启用了。
4 删除交换空间:
a 禁用交换分区:
# swapoff /dev/sdb2
b 从 /etc/fstab 中删除项目;
c 使用fdisk或yast工具删除分区。
删除交换文件步骤同上。
--------------------------------------------------------------------------------
# free -m
total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572
Mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存.
buffers和cached是系统用做缓冲的内存. buffers与某个块设备关联, 包含了文件系统元数据, 并且跟踪了块的变化. cache只包含了文件本身.
-/+ buffers/cache 行则从用户角度显示内存信息, 可用内存从数量上等于mem行used列值减去buffers和cached内存的大小.
因为buffers和cached是操作系统为加快系统运行而设置的, 当用户需要时, 可以只接为用户使用.
top 显示系统运行时的各进程动态、实时的状态(cpu、内存)
top 中有3个列 VIRT RES SHR, 标示了进程使用的内存情况.
VIRT 标识这个进程可以使用的内存总大小, 包括这个进程真实使用的内存, 映射过的文件, 和别的进程共享的内存等.
RES 标识这个这个进程真实占用内存的大小.
SHR 标识可以和别的进程共享的内存和库大小.
vmstat 显示内存的使用情况
这些命令都是从/proc/meminfo中读取内存信息.
关于/proc/meminfo中各行的含意, 在内核源代码的Documentation/filesystems/proc.txt
文件中有叙述
系统的真实内存大小可以用 dmesg | grep mM[mM]看到
/proc/pid/status显示一个进程的详细状态
# cat /proc/5346/status
Name: bash
State: S (sleeping)
SleepAVG: 98%
Tgid: 5346
Pid: 5346
PPid: 5343
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 104 104 104 104
FDSize: 256
Groups: 6 24 29 44 104 113 1000 1001
VmPeak: 6528 kB
VmSize: 6528 kB
VmLck: 0 kB
VmHWM: 1976 kB
VmRSS: 1976 kB
VmData: 752 kB
VmStk: 84 kB
VmExe: 644 kB
VmLib: 1788 kB
VmPTE: 16 kB
Threads: 1
SigQ: 0/4294967295
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000384004
SigCgt: 000000004b813efb
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
VmSize即为该进程内存总大小, 和top输出中的VIRT一致.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。