java虚拟机性能优化_死磕Java虚拟机-性能调优实战篇

Java命令分为如下三种

1.  以java - 开头:标准参数

80a5e8bd6ebc8f624ac62ff08876b9a8.png

2.  以java -X 开头:非标参数

e9312f0b2a7ae6c81c31e99773366068.png

3.  以java -XX 开头:性能调优主要用这个开头的参数,但是无法找到相关参数的帮助文档,下面我教大家几个常用的命令

-XX:+UseSerialGC = Serial New (DefNew) + Serial Old

小型程序。默认情况下不会是这种选项,HotSpot会根据计算及配置和          JDK版本自动选择收集器

-XX:+UseParNewGC = ParNew + SerialOld

这个组合已经很少用(在某些版本中已经废弃)

https://stackoverflow.com/questions/34962257/why-remove-support-for-parnewserialold-anddefnewcms-in-the-future

-XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old

-XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + SerialOld】

-XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old

-XX:+UseG1GC = G1

Linux中没找到默认GC的查看方法,而windows中会打印UseParallelGC

java -XX:+PrintCommandLineFlags -version

通过GC的日志来分辨

Linux下1.8版本默认的垃圾回收器到底是什么?

1.8.0_181 默认(看不出来)Copy MarkCompact

1.8.0_222 默认 PS + PO

java -XX:+PrintFlagsFinal   会打印所有的JVM参数

4.  小案例如下:

package com.fengyaof.jvm.sikejvm;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.util.concurrent.ScheduledThreadPoolExecutor;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public class FullGC_Problem01{

private static class CardInfo{

BigDecimal price = new BigDecimal(0.0);

String name = "张三";

int age = 5;

Date birthday = new Date();

public void m(){

}

}

private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,

new ThreadPoolExecutor.DiscardPolicy());

public static void main(String[] args) throws InterruptedException{

executor.setMaximumPoolSize(50);

for (; ; ) {

modelFit();

Thread.sleep(100);

}

}

private static void modelFit(){

List taskList = getAllCardInfo();

taskList.forEach(info -> {

executor.scheduleWithFixedDelay(new Runnable() {

@Override

public void run(){

info.m();

}

}, 2, 3, TimeUnit.SECONDS);

});

}

private static List getAllCardInfo(){

List taskList = new ArrayList<>();

for (int i = 0; i 

CardInfo info = new CardInfo();

taskList.add(info);

}

return taskList;

}

}

我们在Linux上面用这个命令去运行:

java -Xms100M -Xmx100M -XX:+PrintGC com.fengyaof.jvm.sikejvm.FullGC_Problem01

命令运行如下: 我们可以分析出程序运行到一定的时候,Full GC每次回收的内存是2k,非常少。

c980917784d3cf7f5326367098c60bef.png

我们看看top运行的内存变化:CPU上升的很高,内存消耗百分比(MEM)没有明显变化说明垃圾基本没有回收。

8259f291c4ebe3ed6c073a0649a3eddd.png

那么我们如何定位问题:

1) 先使用下jps 查看进程号

4882ca757b64e94f9ca9b6522e0d3ab0.png

2) 打印进程号的信息:jinfo 1471

3) 使用命令 jstat -gc 1471 1000 (1471代表进程号,1000代表刷新频率)

4) 把进程里面所有的线程列举出来 jstack 1471

这个命令可以检查死锁:

664f5b720bc8afa23f7e1e51db4d5301.png

5)  jmap -histo 1697 | head -20

这个命令可以把类型有多少个对象找出来,这个命令线上不能用,会暂停服务

c49014fd1342fafeff39d6f3511ef285.png

面试经常会问的问题:CPU飙高,内存飙高,内存泄漏,如何排查?其实arthas一个工具就可以搞定

5.  我们用arthas如何进行定位?

arthas启动完成后如下图:

d1e87b91c8b04773b0d023de680f040e.png

arthas常用命令讲解:

1) dashboard  线程飙高怎么排查,可以使用这个命令

92d4a6ffaf580c6fd632a5fc41ee8ff4.png

2) jvm 查看一些基本的信息

3) thread 查看线程的占用情况。

thread中有很好用的命令:找到死锁

thread -b 可以找到死锁

4) 例如微服务里面如何查看哪个服务调用占用的内存多,可是使用下面的命令:

1.  先查询某个类,使用模糊查询:sc *com.fengyaof*

686ed3b7eee41b341c7b60ec1f7f6cba.png

2.  查询某个类里面的方法:

sm com.fengyaof.jvm.sikejvm.FullGC_Problem01

2ed34cc1a86ae934849e1dc9959286bb.png

3.  例如我们对类中某个方法有怀疑,我们可以进行跟踪,使用trace 命令

da1aa074a53b210db9c808bb8dfe5732.png

下面,我教几个arthas重要的命令。

1)  heapdump /root/temp.hprof  把堆导出来做分析

在实际生产过程中,不能使用,服务器会产生暂停。

我们用java自带的工具jvisualvm,把这个堆文件分析一下,如图:

9d2791f819a839f9476dfe002b22a803.png

2) jad 反编译

jad com.fengyaof.jvm.sikejvm.FullGC_Problem01

这个命令很好用,在线可以反编译看看代码是不是最新的。

3) 下面有个场景:我发现我们线上环境的某个代码不是最新的,我们该怎么快速替换这个文件呢,不能重启服务。

使用redefine命令,救急使用

我们总结一下:

CPU飙高:jstack,arthas中的thread可以揪出哪个线程飙高,可以GC线程,也可能是业务线程。

内存飙高:jmap,查看类中有多少个对象,或者是dump文件查看。

GC设定日志参数:

-Xloggc:/path/gc.log

-XX:+UseGCLogFileRotation

-XX:NumberOfGClogFiles=5

-XX:GCLogFileSize=20M

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-XX:+PrintGCCause

设置OOM的堆存储文件:

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=C:/temp/oom.hprof

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java volatile 原子性_Java中volatile不能保证原子性的证明

Java并发编程之验证volatile不能保证原子性通过系列文章的学习&#xff0c;凯哥已经介绍了volatile的三大特性。1&#xff1a;保证可见性 2&#xff1a;不保证原子性 3&#xff1a;保证顺序。那么怎么来验证可见性呢&#xff1f;本文凯哥(凯哥Java:kaigejava)将通过代码演示来证…

mysql 漏洞如何修复_Mysql漏洞修复方法思路及注意事项

【系统环境】系统环境&#xff1a;Red Hat Enterprise Linux Server release 5.4 (Tikanga) 5.7.16 MySQL Community Server (GPL)【漏洞信息】漏洞信息报告&#xff0c;根据集团第三方软件扫描出对应数据库版本的漏洞信息&#xff0c;可以从DVE号跟当前数据库发布版本时间来判…

Java飞机大战敌机消失_Shoot 飞机大战,功能是子弹打在敌机上, 消失 且在内存中 , 小蜜蜂上同理 Games 游戏 247万源代码下载- www.pudn.com...

文件名称: Shoot下载 收藏√ [5 4 3 2 1 ]所属分类: Games开发工具: Java文件大小: 371 KB上传时间: 2015-12-01下载次数: 0提 供 者: 刘星详细说明&#xff1a;飞机大战&#xff0c;功能是子弹打在敌机上&#xff0c;子弹消失敌机消失且在内存中消失&#xff0c;打在小蜜…

日志分析告警实现java_关于Aborted connection告警日志的分析

前言&#xff1a;有时候&#xff0c;连接MySQL的会话经常会异常退出&#xff0c;错误日志里会看到"Got an error reading communication packets"类型的告警。本篇文章我们一起来讨论下该错误可能的原因以及如何来规避。1.状态变量Aborted_clients和Aborted_connects…

网页java在div输出内容_JS实现读取xml内容并输出到div中的方法示例

本文实例讲述了JS实现读取xml内容并输出到div中的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;note.xml文件结构:GeorgeJohnReminderaJohnReminderGeorgeJohnReminder利用js将xml输出到div中&#xff1a;www.jb51.net js读取xml.aaaa{width: 30%;height: 50px;…

java枚举加载顺序_java 中类的加载顺序(转)

1、虚拟机在首次加载Java类时&#xff0c;会对静态初始化块、静态成员变量、静态方法进行一次初始化2、只有在调用new方法时才会创建类的实例3、类实例创建过程&#xff1a;按照父子继承关系进行初始化&#xff0c;首先执行父类的初始化块部分&#xff0c;然后是父类的构造方法…

java相遇问题_两车追及或相遇问题(hdu1275)数学题

两车追及或相遇问题Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 902 Accepted Submission(s):259Problem Description外号叫“猪头三”的小学生在数学课上&#xff0c;经常遇到两车相遇或追及的方程题&#xff0c;…

java常用class类_java常用类

java常用类内部类1.成员内部类&#xff1a;在一个类的内部定义一个完整的类例如&#xff1a;外部类public class Body{内部类class Header{}}内部类可以直接访问外部类的私有成员&#xff0c;而且不破坏封装内部类可以为外部类提供必要的功能组件&#xff0c;成员内部类 在类的…

mysql 分类计数器_PHP MySQL映像计数器

我是PHP新手,一直在研究计数器.计数器很好用,但是现在我想将数字转换成图像.我创建了12张图片0-9,一个空格和一个逗号图片.我在上下搜索,以获取将数字格式转换为图像所需的提示,但没有成功.到目前为止,我所发现的就是如何仅使用文件PHP / MySQL来建立基本的计数器,以及如何使用…

java gc时会暂停运行吗,java gc 项目终止运行

当前位置:我的异常网 编程 java gc 项目终止运行java gc 项目终止运行www.myexceptions.net 网友分享于&#xff1a;2013-09-03 浏览&#xff1a;6次java gc 项目停止运行首先感谢阿宝同学的帮助&#xff0c;我才对这个gc算法的调整有了一定的认识&#xff0c;而不是停留在过…

php 取消页面一些样式,jquery如何去除样式

jquery去除样式的方法&#xff1a;1、使用【removeClass()】方法&#xff0c;代码为【removeClass(function(index,class))】&#xff1b;2、使用toggleClass方法&#xff0c;代码为【toggleClass(class)】。本教程操作环境&#xff1a;windows7系统、jquery3.2.1版&#xff0c…

matlab对经济指标分析,经济背景下的数据预测分析--基于matlab建模(郑铿城)

1、经济预测概述经济预测有三个要素&#xff0c;实际资料是预测的依据&#xff1b;经济理论是预测的基础&#xff1b;数学模型是预测的手段&#xff1b;经济预测的内容包括生产和资源预测&#xff0c;市场预测&#xff0c;国民收入分配预测&#xff0c;居民生活质量预测等。预测…

php nginx 静态资源,Nginx实践篇(1)- Nginx作为静态资源web服务 - 静态资源压缩

一、静态资源web服务1. 静态资源类型类型文件类型浏览器端渲染HTML、CSS、JS图片JEPG、GIF、PNG视频FLV、MPEG文件TXT等其他下载文件2. 静态资源服务场景-CDN二、静态资源核心配置1. 文件读取 sendfilesendfile 是一种高效传输文件的模式.sendfile设置为on表示启动高效传输文件…

php将get传参解析成数组,php解析url (parse_url) 参数成数组 (parse_str)

今天首先让我们为天津8.12大爆炸和陕西山阳山体滑坡遇难的同胞默哀3分钟&#xff0c;祝愿受伤的群众早日康复&#xff0c;脱离危险&#xff0c;希望国家严惩事故责任人&#xff0c;安抚受损群众。希望杯具以后不再发生……最近天灾人祸&#xff0c;大家出行一定要注意安全&…

猛将赵云java,这五位三国猛将临危救主,赵云只能排第二位,第一位大家都服...

曹洪&#xff0c;曹子廉。是曹操的从弟&#xff0c;在《三国演义》小说中&#xff0c;最早跟随曹操起兵&#xff0c;虽然战斗力没有一流战将那么强悍&#xff0c;但是此人在曹操起兵讨伐董卓时&#xff0c;曹操在荥阳被徐荣打败&#xff0c;坐骑丢失。正要被徐荣士兵解决的时刻…

用python画三维图、某区域的高程,python - 在PyQt中绘制具有高程和降低效果的3D矩形/多边形 - SO中文参考 - www.soinside.com...

据我所知&#xff0c;没有内置的PyQt 3D绘制小部件/功能&#xff0c;因为您只能绘制2D多边形。但我们可以创建一个自定义类来模拟3D绘画。从您的Java链接reference&#xff1a;Java支持3D矩形&#xff0c;但第三维的效果不是很明显。由于海拔较低&#xff0c;效果可以忽略不计。…

2024年PMP考试新考纲-PMBOK第七版-项目管理原则真题解析(续3)

马上就要进入2024年了&#xff0c;要参加2024年PMP一季度考试的小伙伴可以准备起来了。2024年的PMP考试将继续采用新考试大纲&#xff0c;考试内容包括PMBOK第六版、PMBOK第七版和敏捷实践指南&#xff0c;而且敏捷&#xff08;或者叫混合&#xff09;的项目环境将占比超过50%&…

linux 串口信息记到日志,[linux学习笔记]之一:ubuntu ch340调试备忘

[linux学习笔记]之一&#xff1a;ubuntu ch340调试备忘已有 2183 次阅读2016-11-8 21:52|个人分类:linux最近迷上了Linux&#xff0c;入了一块板。电脑使用win7ubuntu 双系统&#xff0c;可是调试的时候就麻烦了&#xff0c;ubuntu下写好sd卡镜像&#xff0c;调试的时候还要切换…

嵌入式linux 配置usb otg,嵌入式linux系统环境下USB设备的驱动实现

0 引言嵌入式linux系统环境以其易于移植裁减、内核小、效率高、完整、原代码开放及性能优异等特点&#xff0c;在嵌入式领域得到了非常广泛的应用。Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的…

linux 上下文切换监控,[Linux] 查看进程的上下文切换pidstat

各个进程之间是共享 CPU 资源的&#xff0c;在不同的时候进程之间需要切换&#xff0c;让不同的进程可以在 CPU 执行&#xff0c;那么这个一个进程切换到另一个进程运行&#xff0c;称为进程的上下文切换。进程是由内核管理和调度的&#xff0c;所以进程的切换只能发生在内核态…