网站建设协议 模板,wordpress友情链接导入,邯郸网站设计联系电话,阿里巴巴seo排名优化目录
堆内存相关
显式指定堆内存–Xms和-Xmx
显式新生代内存(Young Generation)
显式指定永久代/元空间的大小
垃圾收集相关
垃圾回收器
GC 日志记录
处理 OOM
JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块#xff0c;Java 堆是所有线…目录
堆内存相关
显式指定堆内存–Xms和-Xmx
显式新生代内存(Young Generation)
显式指定永久代/元空间的大小
垃圾收集相关
垃圾回收器
GC 日志记录
处理 OOM
JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块Java 堆是所有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例几乎所有的对象实例以及数组都在这里分配内存。 显式指定堆内存–Xms和-Xmx
与性能有关的最常见实践之一是根据应用程序要求初始化堆内存。如果我们需要指定最小和最大堆大小推荐显示指定大小以下参数可以帮助你实现
-Xmsheap size[unit]
-Xmxheap size[unit] heap size 表示要初始化内存的具体大小。 unit 表示要初始化内存的单位。单位为 *“ g”* (GB)、*“ m”*MB、*“ k”*KB。
举个栗子 如果我们要为 JVM 分配最小 2 GB 和最大 5 GB 的堆内存大小我们的参数应该这样来写
-Xms2G -Xmx5G
显式新生代内存(Young Generation)
根据Oracle 官方文档open in new window在堆总可用内存配置完成之后第二大影响因素是为 Young Generation 在堆内存所占的比例。默认情况下YG 的最小大小为 1310 MB最大大小为无限制。
一共有两种指定 新生代内存(Young Generation)大小的方法
1.通过-XX:NewSize和-XX:MaxNewSize指定
-XX:NewSizeyoung size[unit]
-XX:MaxNewSizeyoung size[unit]
举个栗子 如果我们要为 新生代分配 最小 256m 的内存最大 1024m 的内存我们的参数应该这样来写
-XX:NewSize256m
-XX:MaxNewSize1024m
2.通过-Xmnyoung size[unit]指定
举个栗子 如果我们要为 新生代分配 256m 的内存NewSize 与 MaxNewSize 设为一致我们的参数应该这样来写
-Xmn256m
GC 调优策略中很重要的一条经验总结是这样说的 将新对象预留在新生代由于 Full GC 的成本远高于 Minor GC因此尽可能将对象分配在新生代是明智的做法实际项目中根据 GC 日志分析新生代空间大小分配是否合理适当通过“-Xmn”命令调节新生代大小最大限度降低新对象直接进入老年代的情况。 另外你还可以通过 -XX:NewRatioint 来设置老年代与新生代内存的比值。
比如下面的参数就是设置老年代与新生代内存的比值为 1。也就是说老年代和新生代所占比值为 11新生代占整个堆栈的 1/2。 -XX:NewRatio1 显式指定永久代/元空间的大小
从 Java 8 开始如果我们没有指定 Metaspace 的大小随着更多类的创建虚拟机会耗尽所有可用的系统内存永久代并不会出现这种情况。
JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小
-XX:PermSizeN #方法区 (永久代) 初始大小
-XX:MaxPermSizeN #方法区 (永久代) 最大大小,超过这个值将会抛出 OutOfMemoryError 异常:java.lang.OutOfMemoryError: PermGen
相对而言垃圾收集行为在这个区域是比较少出现的但并非数据进入方法区后就“永久存在”了。
JDK 1.8 的时候方法区HotSpot 的永久代被彻底移除了JDK1.7 就已经开始了取而代之是元空间元空间使用的是本地内存。
下面是一些常用参数 -XX:MetaspaceSizeN #设置 Metaspace 的初始大小是一个常见的误区后面会解释
-XX:MaxMetaspaceSizeN #设置 Metaspace 的最大大小 垃圾收集相关
垃圾回收器
为了提高应用程序的稳定性选择正确的垃圾收集open in new window算法至关重要。
JVM 具有四种类型的 GC 实现 串行垃圾收集器 并行垃圾收集器 CMS 垃圾收集器 G1 垃圾收集器
可以使用以下参数声明这些实现
-XX:UseSerialGC
-XX:UseParallelGC
-XX:UseParNewGC
-XX:UseG1GC GC 日志记录
生产环境上或者其他要测试 GC 问题的环境上一定会配置上打印 GC 日志的参数便于分析 GC 相关的问题。
# 必选
# 打印基本 GC 信息
-XX:PrintGCDetails
-XX:PrintGCDateStamps
# 打印对象分布
-XX:PrintTenuringDistribution
# 打印堆数据
-XX:PrintHeapAtGC
# 打印Reference处理信息
# 强引用/弱引用/软引用/虚引用/finalize 相关的方法
-XX:PrintReferenceGC
# 打印STW时间
-XX:PrintGCApplicationStoppedTime# 可选
# 打印safepoint信息进入 STW 阶段之前需要要找到一个合适的 safepoint
-XX:PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount1# GC日志输出的文件路径
-Xloggc:/path/to/gc-%t.log
# 开启日志文件分割
-XX:UseGCLogFileRotation
# 最多分割几个文件超过之后从头文件开始写
-XX:NumberOfGCLogFiles14
# 每个文件上限大小超过就触发分割
-XX:GCLogFileSize50M处理 OOM
对于大型应用程序来说面对内存不足错误是非常常见的这反过来会导致应用程序崩溃。这是一个非常关键的场景很难通过复制来解决这个问题。
这就是为什么 JVM 提供了一些参数这些参数将堆内存转储到一个物理文件中以后可以用来查找泄漏:
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath./java_pidpid.hprof
-XX:OnOutOfMemoryError cmd args ; cmd args
-XX:UseGCOverheadLimit
这里有几点需要注意: HeapDumpOnOutOfMemoryError 指示 JVM 在遇到 OutOfMemoryError 错误时将 heap 转储到物理文件中。 HeapDumpPath 表示要写入文件的路径; 可以给出任何文件名; 但是如果 JVM 在名称中找到一个 pid 标记则当前进程的进程 id 将附加到文件名中并使用.hprof格式 OnOutOfMemoryError 用于发出紧急命令以便在内存不足的情况下执行; 应该在 cmd args 空间中使用适当的命令。例如如果我们想在内存不足时重启服务器我们可以设置参数: -XX:OnOutOfMemoryErrorshutdown -r 。 UseGCOverheadLimit 是一种策略它限制在抛出 OutOfMemory 错误之前在 GC 中花费的 VM 时间的比例
JDK监控和故障处理工具总结
这些命令在 JDK 安装目录下的 bin 目录下 jps (JVM Process Status: 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息 jstatJVM Statistics Monitoring Tool: 用于收集 HotSpot 虚拟机各方面的运行数据; jinfo (Configuration Info for Java) : Configuration Info for Java,显示虚拟机配置信息; jmap (Memory Map for Java) : 生成堆转储快照; jhat (JVM Heap Dump Browser) : 用于分析 heapdump 文件它会建立一个 HTTP/HTML 服务器让用户可以在浏览器上查看分析结果; jstack (Stack Trace for Java) : 生成虚拟机当前时刻的线程快照线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。