我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java虚拟机之JVM调优详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java虚拟机之JVM调优详解

JVM常用命令行参数

1. 查看参数列表

虚拟机参数分为基本和扩展两类,在命令行中输入 JAVA_HOME\bin\java就可得到基本参数列表。
在命令行输入 JAVA_HOME\bin\java –X就可得到扩展参数列表。

2. 基本参数说明:

  • -client,-server: 两种Java虚拟机启动方式,client模式启动比较快,但是性能和内存管理相对较差,server模式启动比较慢,但是运行性能比较高,windos上采用的是client模式,Linux采用server模式
  • -classpath -cp: 虚拟机在运行一个类的时候,需要将其转入内存中,虚拟机搜索类的方式和顺序:Bootstrap classes、Extension classes、User classes。
  • Bootstrap 中的路径是虚拟机自带的 jar 或 zip 文件,虚拟机首先搜索这些包文件,用System.getProperty(“sun.boot.class.path”)可得到虚拟机搜索的包名。
  • Extension 是位于 jre\lib\ext 目录下的 jar 文件,虚拟机在搜索完 Bootstrap 后就搜索该目录下的 jar 文件。用 System. getProperty("java.ext.dirs”)可得到虚拟机使用
  • Extension 搜索路径。
  • User classes 搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。
  • -classpath: 告诉虚拟机搜索目录名、jar文档名、zip文档名
  • -verbose[:class|gc|jni]: 在输出设备上显示虚拟机运行信息
  • -verbose:class 输出虚拟机装入的类的信息
  • -verbose:gc 在虚拟机发生内存回收时输出设备信息,用来监视虚拟机内存回收的情况
  • -verbose:jni 虚拟机调用native方法时输出设置显示信息,用来监视虚拟机调用本地方法的情况
  • -version:显示可运行的虚拟机版本信息
  • -showversion:显示版本信息以及帮助信息

3. 扩展参数说明:

  • -Xmixed: 设置 -client 模式虚拟机对使用频率高的方式进行 Just-In-Time 编译和执行,对其他方法使用解释方式执行,该方式是虚拟机缺省模式
  • -Xint: 设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码,有可能会损失性能
  • -Xbootclasspath:path、-Xbootclasspath/a:path、-Xbootclasspath/p:path: 改变虚拟机装载系统运行包 rt.jar,而从-Xbootclasspath 中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时,否则不会用到该参数。
  • /a:将在缺省搜索路径后加上 path 中的搜索路径。
  • /p:在缺省搜索路径前先搜索 path 中的搜索路径。
  • -Xnoclassgc: 关闭虚拟机对 class 的垃圾回收功能,有可能会导致OutOfMemoryError
  • -Xincgc: 启动增量垃圾收集器,缺省是关闭的,增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间,但增量垃圾收集器和应用程序并发执行,会占用部分CPU在应用程序上的功能
  • -Xloggc:file: 将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc 输出内容相同
  • -Xms20M: 设置虚拟机可用内存堆的初始大小为20M,大小为1024的整数倍并且要大于1MB,可用K或者M为单位来设置较大内存数,初始堆大小为2MB,例如:-Xms256M
  • -Xmx20M: 设置虚拟机内存堆的最大可用大小,该值必须为1024的整数倍,并且要大于2MB,可用K或者M为单位来设置较大的内存数,例如:-Xmx81920K,-Xmx80M,当应用程序申请了大内存运行时虚拟机抛出 java.lang.OutOfMemoryError,就需要使用-Xmx来设置了
  • -Xss128K: 设置线程栈的大小,和-Xmx类似,可以用K或M来设置较大的值,也可以在Java中创建线程对象时设置栈的大小
  • -Xoss128k: 设置本地方法栈的大小为128K,不过HotSpot不区分虚拟机栈和本地方法栈,所以这个参数对于HotSpot是无效的
  • -XX:PermSize=10M: 表示JVM初始分配的永久代的容量,必须以M为单位
  • -XX:MaxPermSize=10M: 表示JVM允许分配的永久代的最大容量,必须以M为单位,大部分情况下这个参数默认为64M
  • -XX:NewRatio=4: 表示设置年轻代:老年代的大小比值为1:4,这意味着年轻代占整个堆的1/5
  • -XX:SurvivorRatio=8: 表示设置2个Survivor区:1个Eden区的大小比值为2:8,这意味着Survivor区占整个年轻代的1/5,这个参数默认为8
  • -Xmn20M: 表示设置年轻代的大小为20M
  • -XX:+HeapDumpOnOutOfMemoryError: 表示可以让虚拟机在出现内存溢出异常时Dump出当前的堆内存转储快照
  • -XX:+UseG1GC: 表示让JVM使用G1垃圾收集器
  • -XX:+PrintGCDetails: 表示在控制台上打印出GC具体细节
  • -XX:+PrintGC: 表示在控制台上打印出GC信息
  • -XX:PretenureSizeThreshold=3145728 表示对象大于3145728(3M)时直接进入老年代分配,这里只能以字节作为单位
  • -XX:MaxTenuringThreshold=1: 表示对象年龄大于1,自动进入老年代

虚拟机参数分类

标准: - 开头,所有的HotSpot都支持
非标准:-X 开头,特定版本HotSpot支持特定命令
不稳定:-XX 开头,下个版本可能取消

例如:java -version、java -X


import java.util.List;
import java.util.LinkedList;

public class HelloGC {
  public static void main(String[] args) {
    System.out.println("HelloGC!");
    List list = new LinkedList();
    for(;;) {
      byte[] b = new byte[1024*1024];
      list.add(b);
    }
  }
}

在这里插入图片描述

  • 区分概念:内存泄漏memory leak,内存溢出out of memory
  • java -XX:+PrintCommandLineFlags HelloGC
  • java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
  • PrintGCDetails PrintGCTimeStamps PrintGCCauses
  • java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
  • java -XX:+PrintFlagsInitial 默认参数值
  • java -XX:+PrintFlagsFinal 最终参数值
  • java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
  • java -XX:+PrintFlagsFinal -version |grep GC

调优前的基础概念

1. 吞吐量: 用户代码时间 /(用户代码执行时间 + 垃圾回收时间)
2. 响应时间: STW(Stop The World)越短,响应时间越好

所谓的调优,首先自己要明确,想要的是什么,是吞吐量还是响应时间,还是在满足一定的响应时间的情况下,要求达到多大的吞吐量,一般来说根据业务类型去选择对应的调优方式,比如网站需要的是响应时间优先,JDK1.8尽量选G1,那如果是数据挖掘的需要使用的是吞吐量。

什么是调优

在没有接触过调优之前我们理解的JVM调优就是解决OOM问题,OOM只是JVM调优的一部分

一般是根据需求进行JVM规划和预调优优化运行JVM运行环境(慢,卡顿)解决JVM运行过程中出现的各种问题(OOM)

首先的话,调优是从业务场景开始的,如果没有业务场景的JVM调优都是不靠谱的,比如有时间在实际项目中,有很多个类,成千上万个代码,你怎么知道具体是哪个代码有问题,就算我们知道有段代码频繁的full gc,但是可能过一段时间就OOM了。

1.调优步骤:

  • 熟悉业务场景,选定垃圾回收器(没有最好的垃圾回收器,只有最合适的垃圾回收器)
  • 响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)吞吐量 = 用户时间 /( 用户时间 + GC时间) [PS]
  • 选择回收器组合
  • 计算内存需求(设置内存大小 1.5G 16G)
  • 选定CPU:越高越好
  • 设定年代大小、升级年龄
  • 设定日志参数

-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause或者每天产生一个日志文件

在生产环境中日志文件,后面日志名字,按照系统时间产生,循环产生,日志个数五个,每个大小20M,这样的好处在于整体大小100M,能 控制整体文件大小

观察日志情况

2.调优案例

2.1案例一

垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置

这个问题比较鸡肋,因为很多不同的服务器配置都能够支撑

比如有一百万个订单,每个小时不会产生很高的并发量,我们寻找高峰时间,做一个假设100W订单有72W订单在高峰期产生,比如一个小时平均36W订单,所以我们内存选择大小是按照巅峰时间选择的,很多时间我们可能就是去做压测,实在不行就添加CPU和内存

2.2案例二

12306遭遇春节大规模抢票应该如何支撑

订单信息每天固定,可以丢到缓存中,不同的业务逻辑有不同的业务设计,12306应该是中国并发量最大的秒杀网站,号称并发100W,就是说每秒进行百万次的业务逻辑的处理,估计淘宝一年最高的是54W并发。

如果解决这个问题呢,看下面所示:

CDN -》 LVS -》 NGINX -》 业务系统 -》每台机器1W并发

普通电商的下单流程一般是:

订单 -》下单-》 订单系统减库存 -》 等待用户付款

这个事务如果同步的方式完成,TPS是支撑不了多长时间的

但是在12306里面的模型是

下单-》 减库存和订单同时异步进行 -》 等待付款

异步是当你下完订单之后,它一个线程去减库存,另外一个线程直接把你下单的信息扔到kafka或者redis里面直接返回OK,你下单成功后等待你付款,什么时候你付款完成后面那些个订单处理线程就会去里面拿数据,这个处理完了就会持久化到Hbase或者是mysql,一般大流量的处理方法核心思想就是:分而治之

JVM优化

比如我有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G的堆,用户反馈网站比较缓慢,如果对它进行升级,新服务器64位,16G的堆内存,用户还是反馈卡顿,而且还比之前更严重,这个是因为什么呢?一般来说很多用户去浏览数据,很多数据会load到内存中,导致内存不足,频繁的GC,STW时间过长,响应时间就会变慢,那我们应该怎么办呢,使用 PS-> PN+CMS或者G1。

还有一个就是系统CPU经常100%,我们要如何进行调优呢?

首先我们可以想到CPU100%那么一定有线程在占用系统资源

1.找出哪个进程CPU高 (top命令)

2.该进程中的哪个线程CPU高(top -Hp)

3.导出该线程的堆栈

4.查找哪个方法(栈挣)比较消耗时间

5.工作线程占比高 | 垃圾回收线程占比高

总结

今天我们只是讲解了一些基本的操作,具体怎么操作该怎么办呢?这一部分小农会在下一部分中进行讲解,今天主要带大家了解一些常用的参数,告诉大家怎么去使用和一些前置知识。

到此这篇关于java虚拟机之JVM调优详解的文章就介绍到这了,更多相关JVM调优详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java虚拟机之JVM调优详解

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

下载Word文档

猜你喜欢

Java 虚拟机(JVM)之基本概念详解

1、类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。2、方法区:就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决
2023-05-31

JAVA虚拟机(JVM)详细介绍(七)——JVM优化

还以这个图为例,从.java到.class是编译过程,从.class到机器码是解释过程。下面对其进行分别优化。在优化过程中,对编译阶段的优化主要是对前端编译器的优化,在运行阶段的优化,主要是对即时编译器的优化。编译器优化编译过程以上为javac的编译过程图,以
JAVA虚拟机(JVM)详细介绍(七)——JVM优化
2017-09-20

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。
2023-08-30

JAVA虚拟机(JVM)详细介绍(一)——JVM概述

首先,对以上的四部分进行解释。(1)自动内存管理讲的是java运行时数据区里的部分,分为内存划分和垃圾收集器。(2)执行子系统讲的是画红圈的三部分:类文件结构、类加载机制、字节码执行引擎。(3)优化分别为编译期优化和运行期优化。(4)并发讲的是虚拟机是如何实现
JAVA虚拟机(JVM)详细介绍(一)——JVM概述
2016-06-30

JAVA虚拟机(JVM)详细讲解(二)——内存的划分

我们知道,在C++语言里,如果想使用一个对象,需要对其进行new操作;如果不用这个对象了,需要对其进行delete操作。一旦开发人员忘记写delete语句了,就会造成内存泄露。【内存被对象占用着不还,就叫内存泄露。】而java就聪明了,它从“手动”进化成了“自
JAVA虚拟机(JVM)详细讲解(二)——内存的划分
2020-08-19

Java虚拟机怎么利用JVM进行优化

本篇文章为大家展示了Java虚拟机怎么利用JVM进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言Java虚拟机是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最
2023-05-31

JAVA虚拟机(JVM)详细介绍(五)——类加载机制

上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚
JAVA虚拟机(JVM)详细介绍(五)——类加载机制
2015-12-28

JAVA虚拟机(JVM)详细介绍(八)——高效并发

内存模型内存模型是在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。其主要目标是定义程序中各个变量的访问规则。主内存和工作内存所有的变量都存储在主内存中,每条线程还有自己的工作内存,其工作内存中是被线程使用到的变量的主内存副本拷贝,线程对变量的
JAVA虚拟机(JVM)详细介绍(八)——高效并发
2017-08-31

JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制

在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。在本部分我们要解决如下几个问题:1、哪些内存需要回收
JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
2017-01-27

理解Java虚拟机(JVM):优化代码执行效率的内部机制

本文将深入理解JVM的内部机制,以及如何通过优化代码执行提高程序的性能。
虚拟机程序2024-11-30

JAVA虚拟机(JVM)详细介绍(四)——类文件结构

讲完了自动内存管理,我们来说说执行子系统。执行子系统讲解的是JVM如何执行程序。Class文件概述这篇我们只讲讲Class文件。Class文件又名类文件或字节码文件。javac将.java文件(源代码)编译成.class文件(字节码),jvm再将.class文
JAVA虚拟机(JVM)详细介绍(四)——类文件结构
2016-02-29

JVM的垃圾回收机制详解与调优

这篇文章主要讲解了“JVM的垃圾回收机制详解与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM的垃圾回收机制详解与调优”吧!1.JVM的gc概述gc即垃圾收集机制是指jvm用于释放那
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录