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,一经查实,立即删除!

相关文章

让IE浏览器提示下载或直接打开word文档

核心提示&#xff1a;点击一个指向.doc类型的文件后&#xff0c;怎样不直接在IE里打开&#xff0c;而是弹出一个对话框提示用户想下载还是打开。让IE浏览器提示下载或直接打开word文档 点击一个指向.doc类型的文件后&#xff0c;怎样不直接在IE里打开&#xff0c;而是弹出一个…

2345王牌浏览器九宫格个性化设置

核心提示&#xff1a;2345王牌浏览器九宫格中的每个小窗体显示的网址&#xff0c;都可以进行个性化定制。 2345王牌浏览器九宫格中的每个小窗体显示的网址&#xff0c;都可以进行个性化定制。可以单击 2345王牌浏览器九宫格个性化设置 对某一网页进行编辑 。 可以修改你想要…

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

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

搜狐视频怎么清除应用缓存

今天继续给大家分享搜狐视频方面的内容。搜狐视频播放器是播放器家园网小编用过最好用的一款&#xff0c;在这里能够不同类型的电视剧和电影&#xff0c;都是采用了4K级高清画质&#xff0c;让你随时感受到电影级别的视觉盛宴!搜狐视频客户端支持边下载边观看&#xff0c;云同步…

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

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

爱奇艺视频怎么联系在线人工客服?

爱奇艺视頻是一款非常好的视頻&#xff0c;播放器家园网小编在闲的无聊的情况下&#xff0c;便会应用爱奇艺看来视頻&#xff0c;坚信大家也会应用爱奇艺视頻看来视頻&#xff0c;我们在应用爱奇艺的情况下&#xff0c;便会碰到些难题&#xff0c;今日小编给你详细介绍下&#…

java callback 多线程_JAVA Callback效率测试

在最近的联网电商项目中&#xff0c;想要实现单个web容器内的支付请求&#xff0c;全部能够统一宏观上同步&#xff0c;实现粒度上面异步&#xff0c;找来找去&#xff0c;没有相关方面的框架或者方案&#xff0c;于是最后基于现实场景&#xff0c;打算使用Java callback 的多线…

腾讯视频下载格式_怎么下载腾讯视频

不管这个腾讯视频好用与否&#xff0c;都有一大批用户&#xff0c;本文播放器家园网小编分享腾讯视频下载格式_怎么下载腾讯视频。腾讯视频时刻为您推荐最新最火的视频&#xff0c;精彩不断随时观看。支持各种画质的下载&#xff0c;没网也能享受高视觉的享受&#xff0c;让生活…

腾讯视频下载官方_腾讯视频评论在哪

本文给大家整理了腾讯视频下载官方_腾讯视频评论在哪方面的内容。腾讯视频影音是一款界面轻松友好&#xff0c;功能全面完善&#xff0c;方便好用&#xff0c;绿色安全&#xff0c;完全免费的、专注视频播放的客户端软件&#xff0c;您可运行腾讯视频影音&#xff0c;在线享受腾…

java 复写_课程5.4之函数的复写(override)

本节课程将学习以下内容&#xff1a;函数的复写(override)使用super调用父类的成员函数函数的复写(override)复写(override)&#xff0c;也被称为覆盖或者重写。在你对父类的成员方法不满意的时候&#xff0c;你可以在子类中复写这个方法&#xff0c;来写出符合自己要求的方法。…

mongodb与java连接_MongoDBJava连接

Java 连接MongoDB package mymaven;import java.net.UnknownHostException;import java.util.Set;import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBCursor;import com.mongodb.DBObject;imporJava 连接MongoDBp…

糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上

核心提示&#xff1a;我们有时需要将一些网页中的文字发送到手机上&#xff0c;如商务会谈前&#xff0c;将出行路线和目的地地址发送到手机上便于查看。但是每次都需要手动录入到手机上&#xff0c;费时费力。 我们有时需要将一些网页中的文字发送到手机上&#xff0c;如商务…

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;打在小蜜…

UC浏览器云标签怎么用 UC浏览器云标签使用方法

核心提示&#xff1a;相信很多机友都会使用UC浏览器&#xff0c;但是其多个功能你们能了解多少? 下面小编就为大家介绍UC浏览器云标签使用方法吧! 1、打开【UC浏览器】&#xff0c;点击【多窗口】按钮&#xff0c;然后点击【云标签】;(如下图所示) 2、登陆微博、QQ等&#…

谷歌浏览器怎么设置主页教程

谷歌浏览器怎么设置主页教程 谷歌浏览器怎么设置主页?目前&#xff0c;在世界范围内谷歌浏览器成为了仅次于ie浏览器的第二大主流浏览器&#xff0c;那么&#xff0c;谷歌浏览器主页怎么设置呢?针对此问题&#xff0c;下文浏览器家园小编就为大家图文介绍一下xx谷歌浏览器设置…

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

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

UC浏览器APP如何卸载插件

现在很多用户在使用浏览器的时候都会安装一些插件辅助使用&#xff0c;方便用户享受更多便捷的功能&#xff0c;很多用户都会安装相关的插件服务&#xff0c;方便用户更好的使用&#xff0c;那么在用户不需要这些插件的时候要如何删除呢?今天小编就会与大家一起来分享一下浏览…

java在控制台输出sql_logger4j配置数据库sql输出控制台

#--------------------------------# 设定logger的root level为DEBUG/ERROR/info&#xff0c;指定的输出目的地(appender)为stdoutlog4j.rootLoggerERROR, stdout, fileout#log4j.logger.testinfo#log4j.logger.org.apache.jasper DEBUG#log4j.logger.org.apache.catalina.sta…

爱奇艺2020官方下载_爱奇艺视频如何上传

软件是否好用&#xff0c;还得大家下载爱奇艺安装才知道。本文分享爱奇艺2020官方下载_爱奇艺视频如何上传。爱奇艺电影频道拥有大量高清在线电影资源&#xff0c;热门高清电影、好评电影、电影预告都可以在线观看&#xff0c;不去电影院也能看好电影&#xff0c;而且是看所有电…

网页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;…