本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、JVM概念
什么是JVM?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一
个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关
键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入
Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机
屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代
码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码
解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。
二、JVM内存结构
JVM内存组成结构
JVM内存由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:
三、JVM生命周期
四、JVM堆栈
栈 是运行时的单位,解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定位的8种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame【栈帧】,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
堆 是存储的单位,解决的是数据存储的问题,即数据怎么放、放在哪儿【可以结合图书馆场景来理解】。它是JVM用来存储对象实例以及数组值的区域。堆是JVM中所有线程共享的。
注意:
JVM堆中存的是对象。JVM栈中存的是基本数据类型和JVM堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在JVM栈中,一个对象只对应了一个4byte的引用。
1、堆Heap
JVM堆(Heap)= 年轻代(Young) + 老年代(Tenured) + 持久代(Permanent Generation)【持久代主要存放Java类的类信息,JDK8版本以后把持久代移到了本地内存】
年轻代(Young) = 伊甸园区(Eden) + 2个幸存者区(Survivor)
年轻 代: :
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生
命周期短的对象。年轻代分三个区,即一个伊甸园(Eden)区,两个幸存者(Survivor)区(一
般而言)。
年老 代: :
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为
年老代中存放的都是一些生命周期较长的对象。
持久代: :
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应
用可能动态生成或者调用一些class,在这种时候需要设置一个比较大的持久代空间来存放这些
运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。
六:visualvm远程性能监控wildfly/jboss配置
最近新搭建了系统环境,进行压力测试的时候没有一个好的图形化监控方法来比较直观、方便、动态、实时的来监控应用服务器内存、GC、CPU、进程和磁盘等信息,功能非常强大,图像也很友好。但是wildfy配置jmx的文章资料很少,我通过参考官网和一些贴吧实践琢磨出了配置jmx的流程:
1】确认监控端口(一般都是8080端口)
standalone:查看standalone.xml中jboss.http.port为8080
domain:查看standalone.xml中jboss.http.port为8080
# netstat -anlp | grep 8080\
tcp 0 0 192.168.101.11:8080 0.0.0.0:* LISTEN 21558/java
2】通过wildfly的module.xml文件中添加jboss远程监控模块,并启用该模块
standalone:
vim /opt/wildfly/modules/system/layers/base/org/wildfly/extension/io/main/module.xml
domain:
vim /opt/jboss/modules/system/layers/base/org/wildfly/extension/io/main/module.xml
添加,并启用:
3】jboss添加用户jbsuser,并添加权限
standalone:
/opt/wildfly/bin/add-user.sh -a -u jbsuser -p jbsuser
/opt/wildfly/bin/jboss-cli.sh --connect --commands="/core-service=management/access=authorization/role-mapping=Administrator:add"
/opt/wildfly/bin/jboss-cli.sh --connect --commands="/core-service=management/access=authorization/role-mapping=Administrator/include=jbsuser:add(name=jbsuser,type=USER)"
domain:
/opt/jboss/bin/add-user.sh -a -u jbsuser -p jbsuser
/opt/jboss/bin/jboss-cli.sh --connect --commands="/core-service=management/access=authorization/role-mapping=Administrator:add"
/opt/jboss/bin/jboss-cli.sh --connect --commands="/core-service=management/access=authorization/role-mapping=Administrator/include=jbsuser:add(name=jbsuser,type=USER)"
4】关闭wildfly,通过切换到jbsuser用户(避免误杀),执行pkill -9 java
5】启动wildfly,现在就配置好jmx的远程配置了
standalone:
/opt/wildfly/bin/start.sh
domain:
/opt/jboss/bin/start.sh
6】VisualVM客户端连接:
1、添加远程主机
2、右击,需要点击【添加JMX连接】按钮
3、
service:jmx:http-remoting-jmx://192.xx1.6:8080
输入用户:jbsuser
输入密码:jbsuser
7】激动人心的时刻到了,大家可以点击jmx来监控服务器的资源了,看看成果吧
standalone : 看standalone.xml,jboss.http.port
domain: 看domain.xml 搜索:jboss.http.port