JVM 和垃圾回收|学习笔记

简介: 快速学习 JVM 和垃圾回收

开发者学堂课程【Tomcat 服务器入门详解JVM 和垃圾回收】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/654/detail/10850


JVM 和垃圾回收


十一、垃圾回收器

新生代

·新生代串行收集器:单线程、独占式串行,回收算法标记-复制

·新生代并行收集器:将单线程的串行收集器变成了多线程并行、独占式

·新生代并行回收收集器:多线程并行、独占式,使用复制算法,关注调整吞吐量

老年代:

·老年代串行收集器;单线程、独占式串行,回收算法使用标记-压缩

·老年代并行回收收集器;多线程、独占式并行,回收算法使用标记-压缩,关注调整吞吐量

·CMS 收集器

Concurrent Mark Sweep 并发标记清除算法

在某些阶段尽量使用和工作线程一起运行,减少停顿时长。是互联网站点服务端 BS 系统上较佳的回收算法

分为4个阶:初始标记、并发标记、重新标记、并发清除,在初始标记、重新标记时需要 STW。

·G1 收集器

Garbage First 是最新垃圾回收器,从 DK1.6 实验性提供,JDK1.7发布,其设计目标是在多处理器、大内存服务器端提供优于 CMS 收集器的吞吐量和停顿控制的回收器。建议 JDK8 再考虑它。

基于标记压缩算法。+UseG1GC

分为4个阶段:

初始标记、并发标记、最终标记、筛选回收。并发标记并发执行,其它阶段 STW 只有 GC 线程并行执行。

十二、垃圾收集器设置

可以单独指定新生代、老年代的垃圾收集器

·-XX:+UseSerialGC

运行在 Client 模式下,新生代、老年代都启用串行收集器

·-XX:+UseParNewGC

新生代使用并行收集器,老年代使用串行收集器

·-XX:+UseParallelGC

新生代使用并行回收收集器,老年代使用串行收集器

·-XX:+UseParallelOldGC

新生代、老年代都是用并行回收收集器

-XX:ParallelGCThreads=8,在关注吞吐量的场景使用它增加并行线程数

·-XX:+UseConcMarkSweepGC

新生代使用并行收集器,老年代使用 CMS 收集器

响应时间要短,停顿短使用这个垃圾收集器

-XX:CMSInitiatingOccupancyFraction=N,N为0-100整数表示达到老年代的大小的百分比多少触发回收

默认68

由于 CMS 算法有碎片产生,

还可以将 -XX:+UseCMSCompactAtFullCollection 开启,在 CMS 收集后,进行一次内存碎片整理。

-XX:CMSFullGCsBeforeCompaction=N 设定多少次 CMS 后,进行一次整理

-XX:+UseConcMarkSweepGC-XX: +UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction=5

将参数加入到 bin/catalina.sh 中,重启观察 Tomcat status。老年代已经使用 CMS

Memory Pool

Type

Initial

Total

Maximum

Used

CMS Old Gen

Heap memory

80.00 MB

80.00 MB

312.00 MB

8.94 MB (2%)

Par Eden Space

Heap memory

38.50 MB

38.50 MB

160.00 MB

9.53 MB (5%)

Par Survivor Space

Heap memory

4.75 MB

4.75 MB

20.00 MB

4.75 MB (23%)

Code Cache

Non-heap memory

2.43 MB

5.62 MB

240.00 MB

5.55 MB (2%)

Compressed Class Space

Non-heap memory

0.00 MB

2.12 MB

1024.00 MB

1.90 MB (0%)

Metaspace

Non-heap memory

0.00 MB

17.62 MB

-0.00 MB

16.92 MB

·开启垃圾回收统计信息

-XX:+PrintGC 输出 GC 信息

-XX:+PrintGCDetails 输出 GC 详细信息

-XX:+PrintGCTimeStamps 与前两个组合使用,在信息上加上一个时间戳

-XX:+PrintHeapAtGC 生成更多信息供分析,日志会更大

以上调试完成后,请移除这些参数,否则有非常多的日志输出。

十三、工具

命令

说明

Jps

查看所有jvm进程

Jinfo

查看进程的运行环境参数,主要是jvm命令行参数

Jstat

对jvm应用程序的资源和性能进行实时监控

Jstack

查看所有线程的运行状态

Jmap

查看jvm占用物理内存的状态

Jhat

+UseParNew

Jconsole

 

Jvisualvm

 

Jps:Java virutal machine Process Status tool,

jps [-q] [-mlVV] [<hostid>]

-q:静默模式:

-v:显示传递给 jvm 的命令行参数:

-m:输出传入 main 方法的参数;

-l:输出 main 类或 jar 完全限定名称;

-V:显示通过 flag 文件传递给 jvm 的参数:

[<hostid>]:主机 id,默认为 localhost;

详细列出当前 Java 进程信息

#jps-1-V

Jinfo:输出给定的 java 进程的所有配置信息:

jinfo [option] <pid>

-flags:打印 VM flags

-sysprops: to print Java system properties

-flag <name>: to print the value of the named VM flag

先获得一个 java 进程 ID,然后 jinfo

# jps

# jinfo 6822

# jinfo -flags 6822

Jstat:输出指定的 java 进程的统计信息

jstat -help |-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

[<interval> [<count>]]

interval:时间间隔,单位是毫秒;

count:显示的次数;

返回可用统计项列表

# jstat -options

-class: class loader

-compiler: JIT

-gc: gc

-gccapacity:统计堆中各代的容量

-gccause:

-gcmetacapacity

gcnew:新生代

-gcnewcapacity

-gcold:老年代

-gcoldcapacity

-gcutil

-printcompilation

# jstat -gc 6822

YGC:新生代的垃圾回收次数;

YGCT:新生代垃圾回收消耗的时长;

FGC: Fu1l GC 的次数;

FGCT: Full GC 消耗的时长;

GCT: GC 消耗的总时长;

3次,一秒一次

# jstat -gcnew 6822 1000 3

程序员常用堆栈情况查看工具

jstack:查看指定的 java 进程的线程栈的相关信息:

jstack [-1] <pid>

jstack -F [-m] [-1] <pid>

-l: long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;

-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;

-F: 当使用“jstack -1 PID"无响应,可以使用-F强制输出信息;

先获得一个 java 进程 ID,然后 jinfo

# jps

# jstack -1 6822

jmap: Memory Map, 用于查看堆内存的使用状态;

查看进程堆内存情况

# jmap -heap 6822

Tomcat 常用配置

1、内存空间优化

JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= ”

-server:服务器模式

-Xms:堆内存初始化大小;

-Xmx:堆内存空间上限:

-XX:NewSize=:新生代空间初始化大小;

-XX:MaxNewSize=:新生代空间最大值:

2、线程池调整

<Connector port=" 8080" protocol="HTTP/1.1" connect ionTimeout=" 20000"

redirectPort="8443" />

常用属性:

·maxThreads: 最大线程数,默认200;

·minSpareThreads: 最小空闲线程数;

·maxSpareThreads: 最大空闲线程数;

·acceptCount: 当启动线程满了之后,等待队列的最大长度,默认100;

·URIEncoding: URI 地址编码格式,中文建议使用 UTF-8;

·enableLookups: 是否启用客户端主机名的 DNS 反向解析,缺省禁用,建议禁用,就使用客户端IP就行;

·compression:是否启用传输压缩机制,建议"on",CPU 和流量的平衡;

compressionMinSize: 启用压缩传输的数据流最小值,单位是字节;

compressableMimeType: 定义启用压缩功能的 MIME 类型;

text/html, text/xml, text/css, text/javascript

相关文章
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
503 55
|
10月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
246 27
|
5月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
158 0
|
5月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
112 0
|
7月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
11月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
242 28
|
10月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
10月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
125 0