JVM和GC技术

发布时间 2024-01-03 17:24:57作者: 土豆666

一、JVM

1、Java Virtual Machine(Java虚拟机)

java的跨平台得以实现就是靠的这个JVM,比如你的java程序可以在window上运行,也可以在linux上运行,其实就是java在每个平台上都放了一个虚拟机,而真正的java程序都是在这个虚拟机上运行。

2、JVM的生命周期

当启动一个java程序时,一个java虚拟机实例就产生了,而所有的java程序都是从主程序函数(main)去执行,我运行一个程序其实就是有两个程序去启动,一个是守护线程一个是非守护线程,非守护线程就是真正干活的程序,而守护线程就像保镖一样守护着主线程。

二、GC

GC(Garbage Collection)是自动内存管理的一种技术,用于回收不再使用的对象并释放其占用的内存空间。

年轻代、老年代和元空间是JAVA虚拟机中不同的内存区域,用于存储不同类型的数据。

1、年轻代

年轻代是用于存放新创建的对象的内存区域。年轻代的垃圾回收主要采用复制算法,即将存活的对象从Eden区与Survivor区之间来回复制,经过多次垃圾回收后,存活时间较长的对象会被晋升到老年代。年轻代的垃圾回收频率较高,且回收过程通常较快。

2、老年代

老年代是用于存放长时间存活的对象的内存区域。存活时间较长的对象通常会被晋升到老年代。老年代中的对象具有较长的生命周期,可能是经过多次垃圾回收仍然是存活的,或者是一直存在于程序运行期间的。老年代的垃圾回收时间较长,且在新生代垃圾回收完成后进行,以减少对应用程序的影响。

3、元空间

元空间用于存放存储类的元数据(类的结构、方法、字段等信息)。元空间不进行类似于年轻代和老年代的垃圾回收。类的卸载不会触发元空间的回收操作,JAVA虚拟机自动管理元空间的内存。

总结:

1、年轻代用于存放新创建的短期存活对象,采用复制算法进行垃圾回收,回收频率高。

2、老年代用于存放长期存活的对象,垃圾回收相对较低频,采用更复杂的算法进行垃圾回收,回收时间较长。

3、元空间用于存放类的元数据,大小由本机内存限制,动态分配,不进行垃圾回收,由Java虚拟机自动管理。

三、内存回收机制

1、Mark-Sweep标记清除算法

Mark-Sweep标记清除 优点:清除较快  缺点:删除会产生碎片,不够放大对象

 适合老年代的回收,不是很频繁。

2、copying算法

copying算法  优点:清理的同时进行梳理,可以放大存放对象  缺点:浪费一半的空间

 适合年轻代的处理机制,因为它简单高效。

3、Mark-Compact标记压缩

Mark-Compact标记压缩  优点:标记的时候进行整理,可以存放大对象   缺点:速度慢,效率低

 适合做老年代的压缩,GC回收不频繁。

四、JVM配置

1、JDK版本号

 设置环境变量,设置JDK版本

 2、配置堆内存大小和年轻代与老年代的比例

 五、VisualIVM

如果是JDK1.8的及以上版本,可以不用去装,直接就在物理机bin目录里自带了。

 

如果是JDK1.8以下版本,需要下载http://visualvm.github.io/download.html

需要配置JDK路径:

进入visualvm的etc目录,打开visualvm.conf,添加jdk路径

visualvm_jdkhome ='你的jdk的路径'

1、JMX方式监控

JMX是Java平台提供的一个管理和监控Java应用程序的标准。

(1)catalina-jmx-remote.jar

复制catalina-jmx-remote.jar到/usr/loacal/tomcat7-8083/lib目录里(手动拖拽),catalina-jmx-remote.jar是Apache Tomcat服务器中用于远程JMX访问的拓展包,使用jmx客户端工具远程监控和管理Tomcat服务器的状态、资源使用等。

(2)配置JMX

JMX连接方式需要在目标服务器上配置和启用JMX,并指定一个端口号用户连接。

 改过配置文件后,要重启tomcat。

(3)添加远程主机

输入远程主机名,并在远程机上添加JMX连接。

JMX不支持查看GC,但是可以对堆内存、cpu、类、线程的监控。

 

 (4)添加白名单

如果jmx不能连接,一是要启动tomcat服务,还可能是防火墙的原因,可以将10001端口添加到白名单。

 

2、jstatd方式监控

jstatd是一个独立的远程监控工具,用于监控和收集Java应用程序的运行时统计信息。

(1)复制java.policy文件到/usr/local/jdk1.7.0_80/jre/lib/security目录下(手动拖拽),在使用jstatd工具时,需要使用java.policy文件来配置其访问权限。这是因为jstatd工具需要与运行的Java应用程序进行进行通信和收集统计信息,而这涉及到跨越不同的Java进程和操作系统的边界。

(2)配置服务器地址和端口号

jstatd端口号是10003

 (3)启动jstatd服务

 监控tomcat服务

 

主要关注GC回收的频率。