JVM虚拟机常识

目录

1、什么是JAVA虚拟机

2、JAVA 如何做到跨平台

3、虚拟机堆内存结构(了解)

4、常用虚拟机参数

1、标准参数

2、X 类型参数

3、XX 类型参数

5、常用的JVM参数

1、配置堆空间

2、开启GC日志


两个常识问题

1、什么是JAVA虚拟机

所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。一处编译,到处运行

2、JAVA 如何做到跨平台

同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台
比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台.

1562148557621

3、虚拟机堆内存结构

我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。

JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。

jvm2

新生代:新生区 类在这里产生和应用,最后被垃圾回收。所有的类在伊甸区被new出来,当伊甸区满了,GC会对该区不用的对象销毁,剩余有用的转到幸存区。 老年代:老年区 用于存放生成周期比较长的对象。 永久代:永久区 存放JDK自带的class,interface。

4、常用虚拟机参数

JVM 虚拟机提供了三种类型参数

1、标准参数
标准参数中包括功能和输出的参数都是很稳定的,很可能在将来的JVM版本中不会改变。你可以用 java 命令(或者是用 java -help)检索出所有标准参数。
2、X 类型参数
非标准化的参数,在将来的版本中可能会改变。所有的这类参数都以 -X 开始。
3、XX 类型参数
在实际情况中 X 参数和 XX 参数并没有什么不同。X 参数的功能是十分稳定的。
用一句话来说明 XX 参数的语法。所有的 XX 参数都以"-XX:"开始,但是随后的语法不同,取决于参数的类型:
1)对于布尔类型的参数,我们有"+"或"-",然后才设置 JVM 选项的实际名称。
   例如,-XX:+ 用于激活选项,而 -XX:- 用于注销选项。
   Example:
   开启GC日志的参数: -XX:+PrintGC
2) 对于需要非布尔值的参数,如 string 或者 integer,我们先写参数的名称,后面加上"=",最后赋值。
   例如: -XX:MaxPermSize=2048m

5、常用的JVM参数

1、配置堆空间
-Xms:初始堆大小
-Xmx:最大堆大小
实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大。以避免程序频繁的申请堆空间。设置为物理内存的一半.
[root@localhost bin]# vim catalina.sh +266      #添加完成后重启tomcat
JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx1024m"

在Java中,设置堆内存大小 (-Xms-Xmx) 时,实际上分配的内存可能会略少于设置的值。这是因为JVM在启动时会占用一部分内存用于自身的运行时数据结构、线程栈、内部缓冲区等。 

初始大小:

  

添加指定大小配置后,刷新访问:

2、开启GC日志

GC日志:jvm垃圾回收,记录jvm的运行状态,oom内存溢出的报错信息等。

  • %t 将会被替代为时间字符串,格式为: YYYY-MM-DD_HH-MM-SS

开启GC日志:

#创建GC日志文件
[root@localhost bin]# mkdir /data/logs

[root@localhost bin]# vim catalina.sh +266     #修改完成后重启tomcat
JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx1024m -Xloggc:/data/logs/gc-%t.log"

回到浏览器刷新几下页面后

来到自定义的GC日志目录查看

[root@localhost logs]# cd /data/logs
[root@localhost logs]# ll
total 4
-rw-r----- 1 root root 388 Jun 25 13:21 gc-2024-06-25_13-21-14.log
-rw-r----- 1 root root   0 Jun 25 13:21 gc-2024-06-25_13-21-19.log

 

6、JVM 运维实用排障工具

1、jps
用来查看Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程
常用参数如下:
-q:静默模式,仅打印Java进程的进程ID,不显示主类名或其它信息
-m:列出当前系统上所有正在运行的Java进程的进程ID、主类名和传递给主类的参数。
-l:列出当前系统上所有正在运行的Java进程的进程ID和完整的主类名,包括包路径。
-v:列出当前系统上所有正在运行的Java进程的进程ID、主类名和JVM参数,包括-D系统属性、-X启动参数等。
​
注意: 使用jps 时的运行账户要和JVM 虚拟机启动的账户一致。若启动JVM虚拟机是运行的账户为www,那使用jps指令时,也要使用www 用户去指定。 sudo -u www jps

例:

#查看已经运行的JVM 进程的实际启动参数
[root@localhost ~]# jps -v 
3200 Bootstrap -Djava.util.logging.config.file=/data/application/tomcat2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/data/application/tomcat2 -Dcatalina.home=/data/application/tomcat2 -Djava.io.tmpdir=/data/application/tomcat2/temp
3190 Bootstrap -Djava.util.logging.config.file=/data/application/tomcat1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Xms1024m -Xmx1024m -Xloggc:/data/logs/gc-%t.log -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/data/application/tomcat1 -Dcatalina.home=/data/application/tomcat1 -Djava.io.tmpdir=/data/application/tomcat1/temp
3303 Jps -Denv.class.path=.:/usr/local/java/lib:/usr/local/java/jre/lib:/usr/local/java/lib/tools.jar -Dapplication.home=/usr/local/java -Xms8m
3213 Bootstrap -Djava.util.logging.config.file=/data/application/tomcat3/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/data/application/tomcat3 -Dcatalina.home=/data/application/tomcat3 -Djava.io.tmpdir=/data/application/tomcat3/temp
2、jstack
jstack用于打印出给定的java进程ID或远程调试服务的Java堆栈信息。此信息通常在运维的过程中被保存起来(保存故障现场),以供RD们去分析故障。
常用参数如下:
jstack <pid>
jstack [-l] <pid> //长列表. 打印关于锁的附加信息
jstack [-F] <pid> //当’jstack [-l] pid’没有响应的时候强制打印栈信息

例:

#打印JVM 的堆栈信息,以供问题排查
[root@localhost ~]# jstack -F 3190 > /tmp/jstack.log
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZDICT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值