Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >6个重要的JVM性能参数

6个重要的JVM性能参数

作者头像
FunTester
发布于 2020-04-02 09:51:47
发布于 2020-04-02 09:51:47
1.2K00
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

围绕垃圾收集和内存,您可以将600多个参数传递给JVM。如果包括其他方面,则JVM参数总数将很容易超过1000+。任何人都无法消化和理解太多的论据。在本文中,重点介绍了六个重要的JVM参数,在Java性能测试中起着非常重要的作用。

-Xmx和-XX:MaxMetaspaceSize

-Xmx可能是最重要的JVM参数。-Xmx定义要分配给应用程序的最大堆大小。。您可以这样定义应用程序的堆大小:-Xmx2g

堆大小在影响应用性能和所需物理硬件需求。这带来了一个问题,我的应用程序正确的堆大小是多少?我应该为应用程序分配大堆大小还是小堆大小?答案是:取决于需求和预算。

-Xms-Xmx设置为相同值的会提高JVM性能

元空间是将存储JVM的元数据定义(例如类定义,方法定义)的区域。默认情况下,可用于存储此元数据信息的内存量是无限的(即受您的容器或计算机的RAM大小的限制)。您需要使用-XX:MaxMetaspaceSize参数来指定可用于存储元数据信息的内存量的上限。

-XX:MaxMetaspaceSize=256m

GC算法

OpenJDK中有7种不同的GC算法:

  • Serial GC
  • Parallel GC
  • Concurrent Mark & Sweep GC
  • G1 GC
  • Shenandoah GC
  • Z GC
  • Epsilon GC

如果您未明确指定GC算法,那么JVM将选择默认算法。在Java 8之前,Parallel GC是默认的GC算法。从Java 9开始,G1 GC是默认的GC算法。

GC算法的选择对于确定应用程序的性能起着至关重要的作用。根据我们的研究,我们正在使用Z GC算法观察到出色的性能结果。如果使用JVM 11+,则可以考虑使用Z GC算法(即-XX:+ UseZGC)。

下表总结了激活每种垃圾收集算法所需传递的JVM参数。

GC算法

JVM参数

Serial GC

-XX:+ UseSerialGC

Parallel GC

-XX:+ UseParallelGC

Concurrent Market & Sweep (CMS) GC

-XX:+ UseConcMarkSweepGC

G1 GC

-XX:+ UseG1GC

Shenandoah GC

-XX:+使用ShenandoahGC

Z GC

-XX:+ UseZGC

Epsilon GC

GC -XX:+ UseEpsilonGC

启用GC日志记录

垃圾收集日志包含有关垃圾收集事件,回收的内存,暂停时间段等信息,可以通过传递以下JVM参数来启用垃圾收集日志:

从JDK 1到JDK 8:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{file-path}

从JDK 9及更高版本开始:

-Xlog:gc*:file={file-path}

Demo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/workspace/myAppgc.log
-Xlog:gc*:file=/opt/workspace/myAppgc.log

通常,GC日志用于调整垃圾回收性能。但是,GC日志包含重要的微观指标。这些指标可用于预测应用程序的可用性和性能特征。在本文中将重点介绍一种这样的标尺:GC吞吐量。GC吞吐量是您的应用程序在处理客户交易中花费的时间与它在处理GC活动中花费的时间之比。假设您的应用程序的GC吞吐量为98%,则意味着应用程序将其98%的时间用于处理客户活动,其余2%用于GC活动。

现在,让我们看一个健康的JVM的堆使用情况图:

您会看到一个完美的锯齿图案。您会注意到,当运行Full GC(红色三角形)时,内存利用率将一直下降到最低。

现在,让我们看一下有问题的JVM的堆使用情况图:

您可以注意到,在图表的右端,即使GC反复运行,内存利用率也没有下降。这是一个典型的内存泄漏迹象,表明该应用程序正在存在某种内存问题。

如果您仔细观察一下该图,您会发现重复的完整GC开始在上午8点左右开始。但是,该应用程序仅在上午8:45左右开始获取OutOfMemoryError。到上午8点,该应用程序的GC吞吐量约为99%。但是,在上午8点之后,GC吞吐量开始下降到60%。因为当重复的GC运行时,该应用程序将不会处理任何客户交易,而只会进行GC活动。

-XX:+ HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath

OutOfMemoryError是一个严重的问题,它将影响您的应用程序的可用性和性能。要诊断OutOfMemoryError或任何与内存相关的问题,必须在应用程序开始遇到OutOfMemoryError的那一刻或一瞬间捕获堆转储。由于我们不知道何时会抛出OutOfMemoryError,因此很难在抛出时左右的正确时间手动捕获堆转储。但是,可以通过传递以下JVM参数来自动化捕获堆转储:

-XX:+ HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath = {HEAP-DUMP-FILE-PATH}

-XX:HeapDumpPath中,需要指定堆转储所在的文件路径。传递这两个JVM参数时,将在抛出OutOfMemoryError时自动捕获堆转储并将其写入定义的文件路径。例:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof

一旦捕获了堆转储,就可以使用HeapHeroEclipseMAT之类的工具来分析堆转储。

-Xss

每个应用程序将具有数十,数百,数千个线程。每个线程都有自己的堆栈。在每个线程的堆栈中,存储以下信息:

  • 当前执行的方法/功能
  • 原始数据类型
  • 变量
  • 对象指针
  • 返回值。

他们每个都消耗内存。如果它们的使用量超出某个限制,则会引发StackOverflowError。可以通过传递-Xss参数来增加线程的堆栈大小限制。例:

-Xss256k

如果将此-Xss值设置为一个很大的数字,则内存将被阻塞并浪费。假设您将-Xss值指定为2mb,而只需要256kb,那么您将浪费大量的内存。

假设您的应用程序有500个进程,然后-Xss值为2Mb,则您的线程将消耗1000Mb的内存。另一方面,如果您仅将-Xss分配为256kb,那么您的线程将仅消耗125Mb的内存。每个JVM将节省875Mb内存。

注意:线程是在堆(即-Xmx)之外创建的,因此这1000Mb将是您已经分配的-Xmx值的补充。

-Dsun.net.client.defaultConnectTimeout和-Dsun.net.client.defaultReadTimeout

现代应用程序使用多种协议(即SOAP,REST,HTTP,HTTPS,JDBC,RMI)与远程应用程序连接。有时远程应用程序可能需要很长时间才能做出响应,有时它可能根本不响应。

如果没有正确的超时设置,并且远程应用程序的响应速度不够快,则您的应用程序线程/资源将被卡住。远程应用程序无响应可能会影响您的应用程序的可用性。它可以使您的应用程序停止磨削。为了保护应用程序的高可用性,应配置适当的超时设置。

您可以在JVM级别传递这两个强大的超时网络属性,这些属性可以全局适用于所有使用java.net.URLConnection的协议处理程序:

sun.net.client.defaultConnectTimeout:指定建立到主机的连接的超时(以毫秒为单位)。例如,对于HTTP连接,它是与HTTP服务器建立连接时的超时。当建立与资源的连接时,sun.net.client.defaultReadTimeout指定从输入流读取时的超时(以毫秒为单位)。例如,如果您要将这些属性设置为2秒:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-Dsun.net.client.defaultConnectTimeout=2000
-Dsun.net.client.defaultReadTimeout=2000

注意,默认情况下,这两个属性的值为-1,这表示未设置超时。


  • 郑重声明:文章首发于公众号“FunTester”,欢迎关注交流,禁止第三方(腾讯云除外)转载、发表。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
终于等到你,新的虚拟键盘API 即将到来,快来先睹为快吧!
你是否遇到过一个问题,即在移动设备上有一个固定元素,当键盘激活时,该元素会被键盘遮挡?这已经是多年来网络上的默认行为了。在本文中,我们将探讨这个问题,为什么会发生这种情况,以及如何使用虚拟键盘API来解决它。让我们开始吧。
前端达人
2023/08/31
4690
终于等到你,新的虚拟键盘API 即将到来,快来先睹为快吧!
Material Design — App bars: topApp bars: top
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/06/19
2.4K0
Material Design — Navigation drawerStandard drawer Modal drawer Bottom drawer
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/06/13
4K0
AngularDart Material Design 应用布局 顶
应用布局 应用程序布局是一个样式,指令和组件系统,当它们一起使用时,可以提供材质外观和感知应用程序的层叠关系。 它根据材料规格提供应用栏,抽屉和导航样式。
南郭先生
2018/09/30
4.2K0
Android Design Support Library初探-更新中
这个兼容库容易和Google之前发布的 Android Support Library 22.1 混淆,两者的区别在于:
小小工匠
2021/08/16
1K0
Material Design — 按钮( Buttons)
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
4K0
Human Interface Guidelines —— Tab Bars
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
1.4K0
Material Design — 底部动作条(Bottom Sheets)
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
2K0
认识一下 Material Design Lite 布局组件
MDL的布局/Layout组件用来作为整个页面其他元素的容器,可以自动适应不同的浏览器、 屏幕尺寸和设备。
笔阁
2018/09/04
2.5K0
认识一下 Material Design Lite 布局组件
Material Design —Snackbars &Toasts
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
1.1K0
Android Material Design系列之Navigation Drawer
从今天开始,我们讲一个关于Material Design风格控件系列的文章。个人认为Material Design风格还是非常漂亮和好看的。关于Material Design的控件,从今天这篇开始一个一个的讲,希望能够对大家有所帮助。 Material Design系列控件,我们今天就先从侧滑菜单栏开始,侧滑菜单栏通过名字我们就知道包含两部分,一部分是侧滑(DrawerLayout),一部分是导航菜单栏(NavigationView)。DrawerLayout包含NavigationView,一设置侧滑菜单
非著名程序员
2018/02/02
9590
Android Material Design系列之Navigation Drawer
Material Design — 底部导航(Bottom Navigation)
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
4.2K0
探索 Android Design Support Library v28 新增内容
作者:TonnyL 链接:https://www.jianshu.com/p/e9357355ccf7 著作权归作者所有,欢迎投稿 Android Support Library v28 版本最近被宣布推出 -- 在当前的 alpha 版本中, 我们又有了一系列令人兴奋的新组件. 在这篇文章中, 我想要看看以 Material 视图组件形式添加进入 Support Library 的新增部分. Material Button Material Button 是一个小部件, 可用于在你的应用程序的用户界面中
用户1269200
2018/06/22
1.9K0
Material Design 实战 之第三弹—— 悬浮按钮和可交互提示
下面开始来具体实现。首先仍然需要提前准备好一个图标,这里放置了一张ic_done.png到drawable-xxhdpi目录下。然后修改activity-mam.xml中的代码,如下所示:
凌川江雪
2018/10/09
1.9K0
Material Design 实战 之第三弹—— 悬浮按钮和可交互提示
Material Design之CollapsingToolbarLayout 相关属性和方法介绍
Material Design之CollapsingToolbarLayout 相关属性和方法介绍
103style
2022/12/19
1K0
Material Design之CollapsingToolbarLayout 相关属性和方法介绍
你可能需要为你的 APP 适配 iOS 11
导语:iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆、动态的新风格。 本文介绍iOS11中在UI方面做了哪些更新,有些更新可以为用户提供更加完美的体验,但也有的可能会给目前的APP带来异常bug 前言 前几天发现在做的APP在 iOS11 系统上动画有异常,在其他系统的设备上都是正常的,动画的操作是观察tableView的contentOffset变化后执行的,异常动画发生在tableView reloadData之后,也就是说tableView reloadData之后,tableView的
腾讯Bugly
2018/03/23
1.8K0
Floating Action Button-Android M新控件
浮动操作按钮 (简称 FAB) 是: “一个特殊的promoted操作案例。因为一个浮动在UI之上的圆形图标而显得格外突出,同时它还具有特殊的手势行为”
小小工匠
2021/08/16
1.5K0
一篇博客让你了解Material Design的使用
Material Design是Google设计的一套视觉语言,将优先的经典的设计原理与科技创新相结合,为开发者提供一套完成视觉和交互设计规范。移动设备是这套设计语言的基础对象,让用户在不同的平台、不同尺寸的设备上能保持一致的体验。 Material Design强调交互上的即时反馈,即对于用户的触控等行为app需要给出即时的反应。同时Material Design要求应用给用户带入感,让用户在使用时是沉浸在当前的应用当中。例如Google给出了沉浸式状态栏等“工具”,希望通过改变StatusBar和NavigationBar来给用户更强的融入感,专注于应用本身提供的内容。 Google从动画、颜色、样式、触控反馈、布局等多个方面给出了Material Design的设计要求。无论是单一的控件还是图文布局,Google都给出了明确的设计说明,有兴趣的同学可以去上方提到的官方链接处做进一步了解。
老马的编程之旅
2022/06/22
3.5K0
[Android] 关于系统工具栏和全屏沉浸模式
关于System Bars,之前写过几篇相关的文章:(链接等我把博客迁移好之后补上)
wOw
2018/09/18
1.5K0
[Android] 关于系统工具栏和全屏沉浸模式
Anroid Wear OS 手表应用开发 - UI
智能手表相对手机来说,由于使用场景不同,且屏幕较小,所以应用的设计、交互和手机是有些区别的。相对来说,布局会更简洁,更多地使用滑动手势进行操作。
NanBox
2019/07/09
2.6K0
相关推荐
终于等到你,新的虚拟键盘API 即将到来,快来先睹为快吧!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档