深入虚拟机之JVM成神路

(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数

2022-04-04  本文已影响0人  竹子爱熊猫

引言

   本章节主要用于补齐之前GC篇章、JVM运行时数据区的一些JVM参数以及常用的Linux指令,更多的作用也可以看作是JVM与Linux的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。

“本篇主要用于记录一些常用的JVM参数与Linux指令,方便之后使用时快速查找”。

   在JVM的所有参数中,总体会被分为几种类型:标准参数(Standard)、非标准参数(Non-Standard)、高级运行时选项以及不建议使用(可能会被遗弃的)四大类,其中:

上述简单介绍清楚JVM参数中,不同开头的参数代表的含义后,接下来开始罗列JVM中的参数列表。

当然,也可以根据其他维度定义为行为参数、性能调优参数、调试参数这类的。

PS:本章是将一些常用的JVM、Linux参数写成个参数表,以便于使用时方便查阅,如果你认为对于你有帮助,也欢迎点赞、收藏!当然,对于不足也可以在评论区补充。

一、JVM运行时数据区参数列表

   虚拟机的运行时数据区中,堆空间无疑是最重要的,除堆空间之外,虚拟机栈/本地方法栈(HotSpot中二合一)、元数据空间、本地内存等区域也有对应的参数,接下来依次列出。

1.1、通用参数

1.2、堆空间常用参数

1.3、Java栈参数

1.4、元数据空间参数

1.5、直接内存参数

1.6、调试通用参数

1.7、GC调试通用参数

二、新生代垃圾收集器参数列表

   上述阶段中,将一些JVM通用参数、JVM运行时数据区参数以及部分调试参数进行了简单整理,接下来看看GC相关的一些参数。

2.1、Serial收集器参数

2.2、ParNew收集器参数

2.3、ParallelScavenge收集器参数

三、年老代垃圾收集器参数列表

3.1、SerialOld收集器参数

3.2、ParallelOld收集器参数

3.3、CMS收集器参数

四、整堆分区垃圾收集器参数列表

4.1、G1收集器参数

4.2、ZGC收集器参数

4.3、ShenandoahGC收集器参数

其实整堆收集器中,除开G1之外,其他两款整堆收集器,因为没有做分代实现,所以能够暴露给外部操作的JVM参数其实也并不会太多,大概也只能调调线程数、内存大小、GC触发条件、GC频率这类的了。因为这些整堆收集器本身就能够很好的驾驭已分配的堆空间。

五、Linux系统常用指令

   Linux系统是每位开发者逃不开的话题,程序发布、上线中间件、数据库部署等几乎都会基于Linux系统。因此,对于Linux你大概不需要掌握的特别精通,但至少对于它的一些常用指令必须要会使用,毕竟项目上线、线上排查等场景下,我们都必须要通过指令进行操作。

5.1、目录管理与文件操作指令

5.2、文本操作指令

5.3、文件压缩/解压/备份指令

5.4、系统操作、权限管理/用户群组管理指令

5.5、网络、内存、磁盘管理指令

5.6、Linux超级实用的小技巧

   对于上述罗列的指令是一些经常接触Linux系统时常用的指令,如某些指令未列出,可参考:Linux命令大全。不过在Linux系统中,掌握了众多指令的同时,也要熟练Linux系统中的一些操作,接下来分享一些个人看来比较实用的小技巧!


①同时执行多条指令时,不同命令之间可以用;隔开,如:

cd /usr/xxx/;ls
如上指令执行后的结果则是:进入到指定的目录下,并查看该目录下的所有文件信息。


②如果执行的某条指令耗时比较长,导致自己当前终端需要等待执行完成,无法继续操作时,可以在指令最后加上&符号,将任务交给Linux的后台进程完成,如:

cp /xxx/xxx.xx /xxx/xx/xx.xx &
该条指令执行后,会将拷贝文件的任务交给后台进程执行,当前终端可以继续操作。


③如果当你想要执行一个他人编写好的脚本文件,但却不知道通过什么命令执行时,你可以尝试在前面通过加个.来执行,如下:

. xxx.sh
快速执行指定的脚本文件,当然,也不仅仅只局限于.sh后缀的脚本,该方式可以用于执行大部分的脚本文件。


④如果你想将某个指令执行后的结果,作为其他指令的入参,或想将其执行结果写出到某个文件,那么你可以尝试>、>>、<等这些符号,如:

ls > xxx.txt
上述命令执行后,会将ls指令的执行结果(即当前目录下的所有文件信息)写入到xxx.txt文件中,如果xxx.txt文件不存在,系统会默认创建出来。同时,你也可以通过>>将结果追加到某个文件中,如:ls >> xxx.txt


⑤你如果想要同时执行多个命令,但后面的命令需要建立在前面命令执行成功的基础之上时,你可以尝试使用&&符号,如:

cp /usr/soft/a.txt new.txt && cat new.txt
上述命令中,如果直接执行cat new.txt必然是不行的,因为当前目录下不存在new.txt文件,所以需要先执行拷贝的命令,将其从其他目录下复制过来后,才能执行cat命令。因此,可以将两个指令用&&连接,只有当cp命令执行成功后,再执行cat指令。


⑥当执行一个指令耗时比较长或有可能执行失败时,但又得需要考虑执行失败之后的处理,这种情况可以考虑使用||,如:

wget xxx || wget xxx
执行该指令后,因为wget是从网络上下载文件,所以有时会因为网络问题导致失败,此时我们可以通过||,再次执行wget指令,重新下载。


⑦你执行的命令中,下一条指令需要上一条的结果作为入参,那么可以使用|管道命令,如下:

ps aux | grep java
查询Linux后台的所有进程信息,但是只显示Java的进程。


⑧当你想要同时操作Linux中的多个文件时,可以选择使用通配符*,如下:

rm -rf /xxx/xx/*.txt
如上命令执行之后,会删除指定目录下的所有.txt后缀文件。


⑨...........

   其实在Linux下还有各种各样的符号操作,如$、%、?、#、()、[]、{}、(())、[[]]等,它们都有各自的作用与功能,有些会在Shell编写中经常用到,如$、{}等。同时,上述介绍的几种小技巧中所用的“符号”,在运维人员手中可能会组成一大长串令人“难以直视”的命令,但作为开发人员,对于前面那些技巧简单掌握即可,毕竟咱也不是专业搞运维或Linux云计算/调度开发的。

上一篇 下一篇

猜你喜欢

热点阅读