Linux相关问题汇总(持续)

一.Java项目部署后内存溢出问题OOM Error : Java heap space

        一般为代码执行过程中创建大量对象后无法及时被回收掉导致内存被占满,这里需要部署jar包时输入设置初始内存的指令,通常设置初始堆大小(-Xms)和最大堆大小(-Xmx),在设置内存大小前先查看Linux中项目内存占用情况,需要用到指令jps,即使用JVM监控命令监控JVM的信息

        jps命令:此命令是用来查询与Java相关的进程的,并输出进程号;下图就是展示上面运行的Jar包的进程号:

        

[root@centos7-167-124 admin]# jps -l
9296 /usr/share/java/jenkins.war
12337 sun.tools.jps.Jps
12180 mis-0.0.1-SNAPSHOT.jar

已部署jar包项目前的数字为pid,即进程号

        然后使用jmap命令: jmap -heap 12180 此命令是查询出进程号为 12180 的JVM中堆内存信息,但是如果此时该Linux服务器中装有多个jdk,会导致产生报错

java.lang.RuntimeException: can't determine target's VM version

        这是多个jdk存在导致虚拟环境无法选择对应版本,如果部署项目中的设置都是统一版本,例如项目都是以jdk11为主,那么Linux就要卸载其他版本jdk

        先查看jdk版本 java -version

[root@centos7-167-124 admin]# java -version
openjdk version "11.0.23" 2024-04-16 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.23+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.23+9-LTS, mixed mode, sharing)

        然后选择卸载版本用命令卸载,以jdk1.8为例

yum -y remove java-1.8*

        之后重新设置java版本

sudo update-alternatives --config java

        此时再使用jmap和jps指令挥发现不存在该指令

[root@centos7-167-124 admin]# jmap 
-bash: /bin/jmap: No such file or directory

        因为缺少openjdk-devel包,需要重新安装

[root@namenode ~]# jps
bash: jps: command not found...
 
查看devel版本
[root@namenode ~]# yum list *openjdk-devel*
 
 
 
需要安装openjdk-devel包
[root@namenode ~]# yum install java-11-openjdk-devel.x86_64
 
 
[root@namenode ~]# which jps
/usr/bin/jps
 
 
查看命令是否生效
[root@namenode ~]# jps

        安装后再次使用jmap指令查看栈堆时发现之前的异常提示不见,但是换成另一个提示

        

[root@centos7-167-124 admin]# jmap -heap 12180
\Error: -heap option used
Cannot connect to core dump or remote debug server. Use jhsdb jmap instead

        因为当前jdk版本都是11,指令也替换为jhsdb jmap指令 ,这里用指令查看下相关

[root@centos7-167-124 admin]# jhsdb jmap -help
    <no option>             To print same info as Solaris pmap.
    --heap                  To print java heap summary.
    --binaryheap            To dump java heap in hprof binary format.
    --dumpfile <name>       The name of the dump file.
    --histo                 To print histogram of java object heap.
    --clstats               To print class loader statistics.
    --finalizerinfo         To print information on objects awaiting finalization.
    --pid <pid>             To attach to and operate on the given live process.
    --core <corefile>       To operate on the given core file.
    --exe <executable for corefile>
    --connect [<id>@]<host> To connect to a remote debug server (debugd).

    The --core and --exe options must be set together to give the core
    file, and associated executable, to operate on. They can use
    absolute or relative paths.
    The --pid option can be set to operate on a live process.
    The --connect option can be set to connect to a debug server (debugd).
    --core, --pid, and --connect are mutually exclusive.

    Examples: jhsdb jmap --pid 1234
          or  jhsdb jmap --core ./core.1234 --exe ./myexe
          or  jhsdb jmap --connect debugserver
          or  jhsdb jmap --connect id@debugserver

        查看栈堆信息命令就是jhsdb jmap --heap --pid XXXX,输入项目进程码查看得到栈堆信息

[root@centos7-167-124 admin]# jhsdb jmap --heap --pid 12180
Attaching to process ID 12180, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.23+9-LTS

using thread-local object allocation.
Garbage-First (G1) GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 16848519168 (16068.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 10108272640 (9640.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 4194304 (4.0MB)

Heap Usage:
G1 Heap:
   regions  = 4017
   capacity = 16848519168 (16068.0MB)
   used     = 825374976 (787.138916015625MB)
   free     = 16023144192 (15280.861083984375MB)
   4.898798332185867% used
G1 Young Generation:
Eden Space:
   regions  = 62
   capacity = 645922816 (616.0MB)
   used     = 260046848 (248.0MB)
   free     = 385875968 (368.0MB)
   40.25974025974026% used
Survivor Space:
   regions  = 1
   capacity = 4194304 (4.0MB)
   used     = 4194304 (4.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 136
   capacity = 692060160 (660.0MB)
   used     = 561133824 (535.138916015625MB)
   free     = 130926336 (124.861083984375MB)
   81.08165394176136% used

        这里JVM主要有三个区

  • Eden Space(伊甸园)、
  • Survivor Space(幸存者区)、
  • Old Gen(老年代)

        如果项目内存溢出后根据各区的占用情况再部署时调整相关内存分配大小即可

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值