目录
两个常识问题
1、什么是JAVA虚拟机
所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。一处编译,到处运行
2、JAVA 如何做到跨平台
同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台 比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台.
3、虚拟机堆内存结构
我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。
JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。
新生代:新生区 类在这里产生和应用,最后被垃圾回收。所有的类在伊甸区被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