广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JVM中必须掌握的一些参数
  • 275
分享到

JVM中必须掌握的一些参数

java教程jvm参数 2014-11-20 00:11:13 275人浏览 才女
摘要

有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注。有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还是算了吧。没错,部署的时候可能用不到你亲

有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注。有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还是算了吧。

没错,部署的时候可能用不到你亲自动手,但是出现问题了怎么办,难道不用你解决问题吗,如果对 JVM 了解不够的话,有些问题可能排查起来就很费力,或者根本无法解决。

(推荐视频:java视频教程

本篇以 jdk Hotspot 8 为背景,介绍一下 JVM 的常用参数。建议你在做一些小项目、小 demo 的时候,也把这些参数加上,加深印象。以我的经验来看,有些知识你刚开始接触的时候会感觉很难理解,但是没关系,万事开头难嘛,知识点都是需要消化时间的。第一天不理解,甚至过了一个月也不理解,但是总有那么一刻,你会突然有种茅塞顿开的感觉,感觉一下子通了。最后心里面感谢自己在多少多少天以前能够开始学习并坚持学习这些知识点。

只介绍一些常用参数,除了这些常用参数外,Hotspot 还提供了很多其他的参数,每一个都值得考究。

还是要把内存模型图放在这里,方便理解。

堆参数:

-Xms: 堆的初始值,例如 -Xmx2048,初始堆大小为 2G

-Xmx: 堆的最大值,例如 -Xmx2048M,允许最大堆内存 2G

-Xmn: 新生代大小

-XX:SurvivorRatio:Eden 区所占比例,默认是 8,也就是 80%,例如 -XX:SurvivorRatio=8

最好将 -Xms 和 -Xmx 的值设置成一样的值,这样做是为了防止随着堆空间使用量增加,会动态的调整堆空间大小,有一定的性能损耗,不如开始就设置成相同的值,来规避性能损失。

栈参数

-Xss:栈空间大小,栈是线程独占的,所以是一个线程使用栈空间的大小,例如 -Xss256K,如果不设置此参数,默认值是 1M,一般来讲设置成 256K 就足够了。

Metaspace 参数

-XX:MetaspaceSize:Metaspace 空间初始大小,如果不设置的话,默认是20.79M,这个初始大小是触发首次 Metaspace Full GC 的阈值,例如 -XX:MetaspaceSize=256M

-XX:MaxMetaspaceSize:Metaspace 最大值,默认不限制大小,但是线上环境建议设置,例如

-XX:MaxMetaspaceSize=256M

-XX:MinMetaspaceFreeRatio:最小空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默认值是 40 ,也就是 40%,例如 -XX:MinMetaspaceFreeRatio=40

-XX:MaxMetaspaceFreeRatio:最大空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)大于此值,就会触发 Metaspace 释放空间。默认值是 70 ,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70

建议将 MetaspaceSize 和 MaxMetaspaceSize 设置为同样大小,避免频繁扩容。

GC 日志

简单日志

-verbose:gc 或者 -XX:+PrintGC

日志格式:

[GC (Allocation Failure)  7892K->5646K(19456K), 0.0060442 secs]
[GC (Allocation Failure) , 0.0066315 secs]
[Full GC (Allocation Failure)  19302K->13646K(19456K), 0.0032698 secs]

详细日志

#打印详细日志
-XX:+PrintGCDetails
#打印 GC 的时间点
-XX:+PrintGCDateStamps

日志格式:

2019-11-13T14:06:46.099-0800: [GC (Allocation Failure) 2019-11-13T14:06:46.099-0800: [DefNew (promotion failed) : 9180K->9157K(9216K), 0.0084297 secs]2019-11-13T14:06:46.107-0800: [Tenured: 10145K->10145K(10240K), 0.0035768 secs] 13802K->13646K(19456K), [Metaspace: 3895K->3895K(1056768K)], 0.0120887 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] 
2019-11-13T14:06:47.243-0800: [Full GC (Allocation Failure) 2019-11-13T14:06:47.244-0800: [Tenured: 10145K->10145K(10240K), 0.0042686 secs] 19304K->19146K(19456K), [Metaspace: 3895K->3895K(1056768K)], 0.0043232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

以下几个 GC 日志相关的参数打印的内容比较多,生产环境可选择性开启,大多数时候不需要开启。

GC 前后的堆信息

-XX:+PrintHeapAtGC

{Heap before GC invocations=0 (full 0):
 def new generation   total 9216K, used 7892K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  eden space 8192K,  96% used [0x00000007bec00000, 0x00000007bf3b5200, 
  xxx....
  class space    used 445K, capacity 462K, committed 512K, reserved 1048576K
Heap after GC invocations=1 (full 0):
 def new generation   total 9216K, used 1023K [0x00000007bec00000,
 xxx...
 Metaspace       used 3892K, capacity 4646K, committed 4864K, reserved 1056768K
  class space    used 445K, capacity 462K, committed 512K, reserved 1048576K
}

GC 导致的 Stop the world 时间

-XX:+PrintGCApplicationStoppedTime

Total time for which application threads were stopped: 0.0070384 seconds, Stopping threads took: 0.0000200 seconds

加载类信息

-verbose:class

[Loaded java.net.URLClassLoader$3$1 from /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar]

GC 前后的类加载情况

-XX:+PrintClasshistogramBeforeFullGC
-XX:+PrintClassHistogramAfterFullGC
 num     #instances         #bytes  class name
----------------------------------------------
   1:           140       19016264  [B
   2:          2853         226256  [C
   3:           138         169072  [I
   4:           761          86240  java.lang.Class
   5:          2850          68400  java.lang.String
   6:           660          41024  [Ljava.lang.Object;

日志输出到文件

以上参数配置好之后,默认会输出到控制台或者服务指定的统一日志的位置。但是这里还会有服务的一般性信息日志、错误日志等,都混在一起的话会比较乱,所以,一般都会把 jvm 日志单独存放。

#GC 活动日志,根据配置的参数输出内容
-Xloggc:/Users/fengzheng/jvmlog/gc.log

#致命错误日志,只有在 jvm 发生崩溃的时候会输出
-XX:ErrorFile=/Users/fengzheng/jvmlog/hs_err_pid%p.log

堆溢出现场保留

有些错误虽然不会导致 jvm 崩溃,但是对于服务而言也是非常严重的,比如stackOverflow、OutOfMemoryError,发生错误后,留存现场信息对分析错误原因是至关重要的。jvm 提供了保留堆溢出现场的方法,对于 JDK 8 而言,可能是 heap 溢出,也可能是 Metasapce 溢出。

-XX:HeapDumpPath=/Users/fengzheng/jvmlog
-XX:+HeapDumpOnOutOfMemoryError

最后出现异常后,保存的文件格式为 java_pidxxx.hprof,pid 后面是发生溢出的进程 id,之后可以用 VisualVM、JProfiler 等工具打开分析。

设置垃圾回收器类型

随着 JDK 版本的升级,可使用的垃圾收集器类型也越来越多了。JDK 8 可使用的垃圾收集器有 7 种,当然有点只适用于年轻代,有点只使用于老年代,JDK 8 中最新的垃圾收集器是 G1,可以用于年轻代和老年代。到了 JDK 11,还出了 ZGC。

下图是 JDK 8 中可使用的垃圾收集器以及它们配合使用的关系。

Serial、ParNew、Parallel Scavenge 只适用于年轻代,CMS、Serial Old、Parallel Old 只适用于老年代,而 G1 通用于年轻代和老年代。连线表示它们之间可配合使用的关系,其中 CMS 和 Serial Old 连线的意思是说 Serial Old 会作为 CMS 的后预案,当 CMS 发生 Concurrent Mode Failure 时启用。

在 JDK 8 中,如果不指定垃圾收集器,默认使用参数 -XX:+UseParallelGC,新生代使用 Parallel Scavenge,老年代使用 Serial Old。

-XX:+UseSerialGC:使用 Serial + Serial Old ,运行于 client 模式下的默认设置

-XX:+UseConcMarkSweepGC:使用 ParNew+CMS+Serial Old,CMS 垃圾收集器

-XX:+UseParallelGC:Parallel Scavenge + Serial Old,JDK 8 server 模式下的默认设置

-XX:+UseParallelOldGC:Parallel Scavenge + Parallel Old

-XX:+UseG1GC:使用 G1 垃圾收集器

开启远程 JMX 监控

除了日志外,当我们需要实时查看 JVM 运行情况的时候怎么办,当然可以到 JVM 所在服务器jstack、jmap、jinfo 等工具进行查看,但是又不够直观,这时候就需要开启 JMX 远程功能,使用 jConsole、VisualVM 等工具进行监控。或者自己开发监控平台,比如我之前就做了一个 WEB 版的简易 VisualVm。无意中就做了个 web 版 JVM 监控端

开启参数如下:

-Dcom.sun.management.jmxremote
#指定 jvm 所在服务器 ip 或域名
-Djava.rmi.server.hostname=192.168.1.1
#指定端口
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

本文来自编程界网,java教程栏目,欢迎学习!

--结束END--

本文标题: JVM中必须掌握的一些参数

本文链接: https://www.lsjlt.com/news/4265.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM中必须掌握的一些参数
    有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注。有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还是算了吧。没错,部署的时候可能用不到你亲...
    99+
    2014-11-20
    java教程 jvm 参数
  • 你必须完全掌握参数(附实例)精选
    这篇文章主要介绍你必须完全掌握参数(附实例)精选,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!上次我们谈到函数的参数我们继续接着上次补充:参数分为形参和实参2部分:形参就是形式上的参数,在定义函数的括号中使用;实参就...
    99+
    2023-06-15
  • NUMPY:Python编程中必须掌握的库!
    NumPy是Python编程中不可或缺的库之一。这个强大的库提供了高效的数组操作,使得在Python中进行科学计算和数据分析变得更加容易。在本文中,我们将介绍NumPy的基本概念和常用方法,帮助你快速上手使用它。 一、NumPy简介 Num...
    99+
    2023-09-03
    分布式 npm numy
  • 必须掌握的数据库面试题有哪些
    本篇内容介绍了“必须掌握的数据库面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、为什么使用数...
    99+
    2022-10-18
  • NumPy:Python 面试中必须掌握的数组技巧!
    NumPy 是 Python 中一个非常重要的数据处理库,它提供了高效的数组操作工具,极大地简化了数据处理和科学计算的工作。在 Python 面试中,掌握 NumPy 库的使用技巧是非常重要的,这篇文章将介绍几个必须掌握的数组技巧。 创...
    99+
    2023-08-30
    面试 数组 numy
  • SEOer必须掌握的标配技术有哪些
    这篇文章主要为大家展示了“SEOer必须掌握的标配技术有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEOer必须掌握的标配技术有哪些”这篇文章吧。  首先,认识网页代码是基础  这里所讲...
    99+
    2023-06-10
  • Redis中必须要掌握的20个问题有哪些
    今天就跟大家聊聊有关Redis中必须要掌握的20个问题有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。给大家分享20个必知必会、必须要掌握的Re...
    99+
    2022-10-18
  • PHP开发中必须掌握的数据类型和函数有哪些?
    PHP作为一种非常流行的后端编程语言,其数据类型和函数的掌握至关重要。在本文中,我们将探讨PHP开发中必须掌握的数据类型和函数。本文旨在帮助开发人员更好地了解PHP编程语言,为他们构建更好的应用程序。 一、数据类型 1.字符串类型(stri...
    99+
    2023-10-22
    数据类型 函数 ide
  • 10个必须要掌握的Python内置函数
    目录内置函数简介1.input2.enumerate()3.eval()4.format()5.map()6.print()7.range()8.reversed()9.sorted...
    99+
    2022-11-13
  • 想要更好地掌握 Python 开发技术中的 NumPy 函数,这些技巧必须掌握!
    Python 是一种广泛使用的编程语言,它在数据科学、人工智能、机器学习和其他领域都有着广泛的应用。NumPy 是 Python 中一个非常重要的库,它提供了高效的数值计算和数组操作功能。在 Python 开发中,掌握 NumPy 函数是非...
    99+
    2023-06-03
    开发技术 numy 函数
  • 前端必须要掌握CSS3的属性有哪些
    小编给大家分享一下前端必须要掌握CSS3的属性有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. Border-radiu...
    99+
    2022-10-19
  • 学redis必须要掌握的知识点有哪些
    这篇文章主要介绍学redis必须要掌握的知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于redis你必须要掌握的8个知识如下:1、redis是什么redis是一种支持K...
    99+
    2022-10-18
  • Java程序员必须掌握的注解有哪些
    这篇文章主要讲解了“Java程序员必须掌握的注解有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java程序员必须掌握的注解有哪些”吧!划重点自 JDK5 推出以来,注解已成为Java生...
    99+
    2023-06-17
  • java架构师必须掌握的技术有哪些
    这篇文章主要介绍“java架构师必须掌握的技术有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java架构师必须掌握的技术有哪些”文章能帮助大家解决问题。一、前言一个成熟的大型网站(如淘宝、京东...
    99+
    2023-06-05
  • Linux必须掌握的shell脚本基础有哪些
    Linux必须掌握的shell脚本基础有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 shell 基本语法shell:shell 是一个命令解释器,它在操作系统的最外层,...
    99+
    2023-06-05
  • 你知道哪些Java API在面试中必须掌握?
    Java API 是 Java 程序员必须熟练掌握的重要工具,而在面试中,掌握 Java API 更是必要的。本文将介绍一些在面试中必须掌握的 Java API。 1. Collection API Collection API 是 Jav...
    99+
    2023-11-14
    面试 学习笔记 api
  • Python 开发者必须掌握的 npm 函数技能有哪些?
    随着 JavaScript 在 Web 开发中的流行,npm 成为了一个非常重要的工具,它是一个包管理器,可以帮助开发者轻松地下载和管理 JavaScript 库。而 Python 开发者也可以受益于 npm,使用它来下载和管理 Java...
    99+
    2023-09-01
    开发技术 npm 函数
  • 做运营必须掌握数据分析思维有哪些
    这篇文章主要介绍了做运营必须掌握数据分析思维有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据分析是精细化的运营工作,一定要建立起体系化的思维,切勿盲目分析,粗暴分析。...
    99+
    2023-06-10
  • Java开发者必须掌握的大数据技术?
    随着大数据时代的到来,越来越多的企业开始注重数据的价值和利用。在这个过程中,Java作为一种非常流行的编程语言,也扮演着非常重要的角色。Java开发者需要掌握一些大数据技术,以便更好地利用数据。本文将介绍一些Java开发者必须掌握的大数据...
    99+
    2023-07-04
    大数据 ide 数据类型
  • MySQL必须掌握的技能有哪些?- 入门指南
    MySQL必须掌握的技能有哪些?- 入门指南导语:MySQL是一种常用的关系型数据库管理系统,广泛用于Web应用程序的开发。无论是为了提升自己的职业发展还是为公司的业务提供支持,掌握MySQL的技能都是至关重要的。本文将介绍MySQL的一些...
    99+
    2023-10-22
    查询 SQL 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作