JVM性能调优 (二)

手势识别器:实现手部动作识别器 在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。 阅读详情
在上文中我们分析了很多性能监控工具,介绍这些工具的目的只有一个,那就是找出对应的性能瓶颈。盲目的性能调优是没有效果的,只有充分知道了哪里出了问题,针对性的结果才是立竿见影的。解决了主要的性能问题,那些次要的性能问题也就不足为虑了!

我们知道,性能问题无非就这么几种:CPU、内存、磁盘IO、网络。那我们来逐一介绍以下相关的现象和一些可能出现的问题。

一、CPU过高。

查看CPU最简单的我们使用任务管理器查看,如下图所示,windows下使用任务管理器查看,Linux下使用top查看。

深入理解JVM性能调优
深入理解JVM性能调优

一般我们的服务器都采用Linux,因此我们重点关注一下Linux(注:windows模式下相信大家已经很熟悉了,并且前面我们已经提到,使用资源监视器可以很清楚的看到系统的各项参数,在这里我就不多做介绍了)

在top视图下,对于多核的CPU,显示的CPU资源有可能超过100%,因为这里显示的是所有CPU占用百分百的总和,如果你需要看单个CPU的占用情况,直接按键1就可以看到。如下图所示,我的一台测试机为8核16GB内存。

深入理解JVM性能调优

在

top 视图下,按键 shift+h 后,会显示各个线程的 CPU 资源消耗情况,如下图所示:
深入理解JVM性能调优

我们也可以通过

sysstat 工具集的 pidstat 来查看

注:sysstat下载地址:http://sebastien.godard.pagesperso-orange.fr/download.html

安装方法:

1、chmod +x configure

2、./configure

3、make

4、make install

如输入pidstat 1 2就会隔一秒在控制台输出一次当然CPU的情况,共输出2次

深入理解JVM性能调优

除了

top 、 pidstat 以外, vmstat 也可以进行采样分析
深入理解JVM性能调优

相关

top 、 pidstat 、 mstat 的用法大家可以去网上查找。

下面我们主要来介绍以下当出现CPU过高的时候,或者CPU不正常的时候,我们该如何去处理?

CPU消耗过高主要分为用户进程占用CPU过高和内核进程占用CPU过高(在Linux下top视图下us指的是用户进程,而sy是指内核进程),我们来看一个案例:

深入理解JVM性能调优

程序运行前,系统运行平稳,其中蓝色的线表示总的

CPU 利用率,而红色的线条表示内核使用率。部署 war 测试程序,运行如下图所示:
深入理解JVM性能调优

对于一个

web 程序,还没有任何请求就占用这么多 CPU 资源,显然是不正常的。并且我们看到,不是系统内核占用的大量 CPU ,而是系统进程,那是哪一个进程的呢?我们来看一下。
深入理解JVM性能调优

很明显是我们的

java 进程,那是那个地方导致的呢?这就需要用到我们之前提到的性能监控工具。在此我们使用可视化监控工具 VisualVM 。
深入理解JVM性能调优

首先我们排除了是

GC 过于频繁而导致大 CPU 过高,因为很明显监控视图上没有 GC 的活动。然后我们打开 profilter 去查看以下,是那个线程导致了 CPU 的过高?
深入理解JVM性能调优

前面一些线程都是容器使用的,而下面一个线程也一直在执行,那是什么地方调用的呢?查找代码中使用

ThredPoolExecutor 的地方。终于发现以下代码。

private BlockingQueuequeue;

private Executor executor;

//……

publicvoid run() {

    while(true){

try {

SendMsg sendMsg = queue.poll();//从队列中取出

if(null != sendMsg) {

sendForQueue(sendMsg);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

问题很显然了,我们看一下对应BlockingQueue的poll方法的API文档。

深入理解JVM性能调优

不难理解了,虽然使用了阻塞的队列,但是使用了非阻塞的取法,当数据为空时直接返回

null ,那这个语句就等价于下面的语句。

@Override

publicvoid run() {

while(true){

}

}

相当于死循环么,很显然是非常耗费CPU资源的,并且我们还可以发现这样的死循环是耗费的单颗CPU资源,因此可以解释上图为啥有一颗CPU占用特别高。我们来看一下部署在Linux下的top视图。

深入理解JVM性能调优

猛一看,不是很高么?我们按键

1 来看每个单独 CPU 的情况!
深入理解JVM性能调优

这下看的很清楚了吧!明显一颗

CPU 被跑满了。(因为一个单独的死循环只能用到一颗 CPU ,都是单线程运行的)。

问题找到,马上修复代码为阻塞时存取,如下所示:

@Override

publicvoid run() {

while(true){

try {

SendMsg sendMsg = queue.take();//从队列中取出

sendForQueue(sendMsg);

} catch (Exception e) {

e.printStackTrace();

}

}

}

深入理解JVM性能调优

再来监控

CPU 的变换,我们可以看到,基本上不消耗 CPU 资源(是我没做任何的访问哦,有用户建立线程就会消耗)。
深入理解JVM性能调优

再来看

java 进程的消耗,基本上不消耗 CPU 资源
深入理解JVM性能调优
深入理解JVM性能调优

再来看VisualVM的监控,我们就可以看到基本上都是容器的一些线程了

深入理解JVM性能调优

以上示例展示了

CPU 消耗过高情况下用户线程占用特别高的情况。也就是 Linux 下 top 视图中 us 比较高的情况。发生这种情况的原因主要有以下几种:程序不停的在执行无阻塞的循环、正则或者纯粹的数学运算、 GC 特别频繁。

CPU过高还有一种情况是内核占用CPU很高。我们来看另外一个示例。

package com.yhj.jvm.monitor.cpu.sy;

import java.util.Random;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* @Described:系统内核占用CPU过高测试用例

* @author YHJ create at 2012-3-28 下午05:27:33

* @FileNmae com.yhj.jvm.monitor.cpu.sy.SY_Hign_TestCase.java

*/

publicclass SY_Hign_TestCase {

privatefinalstaticintLOCK_COUNT = 1000;

//默认初始化LOCK_COUNT个锁对象

private Object [] locks = new Object[LOCK_COUNT];

private Random random = new Random();

//构造时初始化对应的锁对象

public SY_Hign_TestCase() {

for(int i=0;i<LOCK_COUNT;++i)

locks[i]=new Object();

}

abstractclass Task implements Runnable{

protected Object lock;

public Task(int index) {

this.lock= locks[index];

}

@Override

publicvoid run() {

while(true){  //循环执行自己要做的事情

doSth();

}

}

//做类自己要做的事情

publicabstractvoid doSth();

}

//任务A 休眠自己的锁

class TaskA extends Task{

public TaskA(int index) {

super(index);

}

@Override

publicvoid doSth() {

synchronized (lock) {

try {

lock.wait(random.nextInt(10));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//任务B 唤醒所有锁

class TaskB extends Task{

public TaskB(int index) {

super(index);

    }

@Override

publicvoid doSth() {

try {

synchronized (lock) {

lock.notifyAll();

Thread.sleep(random.nextInt(10));

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

//启动函数

publicvoid start(){

ExecutorService service = Executors.newCachedThreadPool();

for(int i=0;i<LOCK_COUNT;++i){

service.execute(new TaskA(i));

service.execute(new TaskB(i));

}

}

//主函数入口

publicstaticvoid main(String[] args) {

new SY_Hign_TestCase().start();

}

}

代码很简单,就是创建了2000个线程,让一定的线程去等待,另外一个线程去释放这些资源,这样就会有大量的线程切换,我们来看下效果。

深入理解JVM性能调优

很明显,

CPU 的内核占用率很高,我们拿具体的资源监视器看一下:
深入理解JVM性能调优

很明显可以看出有很多线程切换占用了大量的

CPU 资源。

同样的程序部署在Linux下,top视图如下图所示:

深入理解JVM性能调优

展开对应的

CPU 资源,我们可以清晰的看到如下情形:
深入理解JVM性能调优

大家可以看到有大量的

sy 内核占用,但是也有不少的 us , us 是因为我们启用了大量的循环,而 sy 是因为大量线程切换导致的。

我们也可以使用vmstat来查看,如下图所示:

深入理解JVM性能调优

二、文件

IO 消耗过大,磁盘队列高。

在windows环境下,我们可以使用资源监视器查看对应的IO消耗,如下图所示:

深入理解JVM性能调优

这里不但可以看到当前磁盘的负载信息,队列详情,还能看到每个单独的进程的资源消耗情况。

Linux下主要使用pidstat、iostat等进行分析。如下图所示

Pidstat –d –t –p [pid] {time} {count}

如:pidstat -d -t -p 18720 1 1

深入理解JVM性能调优
深入理解JVM性能调优

Iostat

深入理解JVM性能调优  

Iostat –x xvda 1 10做定时采样

深入理解JVM性能调优

废话不多说,直接来示例,上干货!

package com.yhj.jvm.monitor.io;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* @Described:IO测试用例

* @author YHJ create at 2012-3-29 上午09:56:06

* @FileNmae com.yhj.jvm.monitor.io.IO_TestCase.java

*/

publicclass IO_TestCase {

private String fileNmae = "monitor.log";

private String context ;

// 和CPU处理器个数相同,既充分利用CPU资源,又导致线程频繁切换

privatefinalstaticintTHRED_COUNT = Runtime.getRuntime().availableProcessors();

public IO_TestCase() {//加长写文件的内容,拉长每次写入的时间

StringBuilder sb = new StringBuilder();

for(int i=0;i<1000;++i){

sb.append("context index :")

.append(i)

.append("\n");

this.context= new String(sb);

}

}

//写文件任务

class Task implements Runnable{

@Override

publicvoid run() {

while(true){

BufferedWriter writer = null;

try {

writer = new BufferedWriter(new FileWriter(fileNmae,true));//追加模式

writer.write(context);

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

//启动函数

publicvoid start(){

ExecutorService service = Executors.newCachedThreadPool();

for(int i=0;i<THRED_COUNT;++i)

service.execute(new Task());

}

//主函数入口

publicstaticvoid main(String[] args) {

new IO_TestCase().start();

}

}

这段示例很简单,通过创建一个和CPU个数相同的线程池,然后开启这么多线程一起读写同一个文件,这样就会因IO资源的竞争而导致IO的队列很高,如下图所示:

深入理解JVM性能调优

关掉之后马上就下来了

深入理解JVM性能调优

我们把这个部署到

Linux 上观看。
深入理解JVM性能调优

这里的

%idle 指的是系统没有完成写入的数量占用 IO 总量的百分百,为什么这么高我们的系统还能承受?因为我这台机器的内存为 16GB 的,我们来查看以下 top 视图就可以清晰的看到。
深入理解JVM性能调优

占用了大量的内存资源。

三、内存消耗

对于JVM的内存模型大家已经很清楚了,前面我们讲了JVM的性能监控工具。对于Java应用来说,出现问题主要消耗在于JVM的内存上,而JVM的内存,JDK已经给我们提供了很多的工具。在实际的生成环境,大部分应用会将-Xms和-Xmx设置为相同的,避免运行期间不断开辟内存。

对于内存消耗,还有一部分是直接物理内存的,不在堆空间,前面我们也写过对应的示例。之前一个系统就是因为有大量的NIO操作,而NIO是使用物理内存的,并且开辟的物理内存是在触发FULL GC的时候才进行回收的,但是当时的机器总内存为16GB 给堆的内存是14GB Edon为1.5GB,也就是实际剩下给物理呢哦村的只有0.5GB,最终导致总是发生内存溢出,但监控堆、栈的内存消耗都不大。在这里我就不多写了!

四、网络消耗过大

Windows下使用本地网络视图可以监控当前的网络流量大小

深入理解JVM性能调优

更详细的资料可以打开资源监视器,如下图所示

深入理解JVM性能调优

Linux

平台可以使用以下sar 命令查看

sar -n DEV 1 2

深入理解JVM性能调优

字段说明:

rxpck/s:每秒钟接收的数据包

txpck/s:每秒钟发送的数据包

rxbyt/s:每秒钟接收的字节数

txbyt/s:每秒钟发送的字节数

rxcmp/s:每秒钟接收的压缩数据包

txcmp/s:每秒钟发送的压缩数据包

rxmcst/s:每秒钟接收的多播数据包

Java程序一般不会出现网络IO导致问题,因此在这里也不过的的阐述。

五、程序执行缓慢

当CPU、内存、磁盘、网络都不高,程序还是执行缓慢的话,可能引发的原因大致有以下几种:

1程序锁竞争过于激烈,比如你只有2颗CPU,但是你启用了200个线程,就会导致大量的线程等待和切换,而这不会导致CPU很高,但是很多线程等待意味着你的程序运行很慢。

2未充分利用硬件资源。比如你的机器是16个核心的,但是你的程序是单线程运行的,即使你的程序优化的很好,当需要处理的资源比较多的时候,程序还会很慢,因此现在都在提倡分布式,通过大量廉价的PC机来提升程序的执行速度!

3其他服务器反应缓慢,如数据库、缓存等。当大量做了分布式,程序CPU负载都很低,但是提交给数据库的sql无法很快执行,也会特别慢。

总结一下,当出现性能问题的时候我们该怎么做?

一、CPU过高

1、  us过高

使用监控工具快读定位哪里有死循环,大计算,对于死循环通过阻塞式队列解决,对于大计算,建议分配单独的机器做后台计算,尽量不要影响用户交互,如果一定要的话(如框计算、云计算),只能通过大量分布式来实现

2、  sy过高

最有效的方法就是减少进程,不是进程越多效率越高,一般来说线程数和CPU的核心数相同,这样既不会造成线程切换,又不会浪费CPU资源

二、内存消耗过高

1、  及时释放不必要的对象

2、  使用对象缓存池缓冲

3、  采用合理的缓存失效算法(还记得我们之前提到的弱引用、幽灵引用么?)

三、磁盘IO过高

1、  异步读写文件

2、  批量读写文件

3、  使用缓存技术

4、  采用合理的文件读写规则

四、网络

1、增加宽带流量

五、资源消耗不多但程序运行缓慢

1、使用并发包,减少锁竞争

2、对于必须单线程执行的使用队列处理

3、大量分布式处理

六、未充分利用硬件资源

1、  修改程序代码,使用多线程处理

2、  修正外部资源瓶颈,做业务拆分

3、  使用缓存


转自:http://yhjhappy234.blog.163.com/blog/static/3163283220122298232721/?suggestedreading&wumii
实战篇| app爬虫不用真机 之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂) 阅读详情

相关推荐

华为昇腾NPU环境搭建:torch-npu安装避坑指南(附常见错误解决方案)

本文详细解析了在华为昇腾NPU环境中安装torch-npu适配包的全流程与核心要点。从基础环境准备、严格的版本匹配策略,到针对‘RuntimeError: NPU error’、‘ImportError: libxxx.so’等高频错误的深度解析与解决方案,提供了一份实用的避坑指南,旨在帮助开发者高效搭建稳定的PyTorch开发环境。

weixin_29094979的博客 411

了解磁盘IO的那些事

作为程序开发,我们的任务就是在操作系统允许的范围内,了解其原理,减少磁盘 IO 中数据的搬运以及系统的调用的次数,提高系统的性能。尽管有了协处理器 DMA 的参与,但是数据的读取依然存在多次的数据搬运的过程,减少数据多次的搬运,是否能提高程序运行的性能?对于数据写磁盘的事情也是受到操作系统内核的约束,我们在程序开发的时候,经常性做的一件事件就是将写的操作放到一块,一起写入磁盘,而不是需要写的时候就直接写入,尤其在操作数据库的时候。③. 磁盘驱动器收到内核的 IO 请求,把数据从磁盘读取到驱动器的缓冲中。

hogwarts_ziqi的博客 962

从零到一:手把手教你用HFSS仿真60GHz圆极化磁电偶极子天线(附参数调优心得)

本文详细介绍了在HFSS中设计60GHz圆极化磁电偶极子天线的全流程,包括仿真环境搭建、参数化建模、收敛性优化和性能验证。通过系统化的参数扫描和优化策略,显著提升了天线的轴比带宽和增益性能,为毫米波通信应用提供了高效的天线设计解决方案。

weixin_42614269的博客 311

JVM调优方法论

JVM调优方法论

安静的软件工程师 1380

基于STM32的可穿戴式多生理参数实时监测与预警系统

针对传统可穿戴健康设备存在的生理参数监测种类单一、数据处理依赖云端导致响应滞后、续航能力弱等问题,设计一种基于STM32的可穿戴式多生理参数实时监测与预警系统。系统以STM32L476RG低功耗微控制器为核心,集成心率血氧传感器、体温传感器、血压传感器,实现人体心率、血氧饱和度、体温、收缩压/舒张压的同步采集;通过边缘端轻量化数据处理算法完成参数异常判定,结合低功耗硬件设计与软件休眠策略,在保证监测精度的同时延长续航。测试结果表明,系统心率监测误差≤2次/分钟,血氧饱和度误差≤2%,体温误差≤±0.2℃,血

m0_74026776的博客 2041

KF-gins输出结果绘图

KF-gins输出结果绘图

m0_51977577的博客 1107

JVM常用调优方法

一、常用调优方法 1、将新对象预留在新生代 由于 Full GC 的成本要远远高于 Minor GC ,因此尽可能将对象分配在新生代,在JVM 调优中,可以为应用程序分配一个合理的新生代空间,以最大限度避免新对象直接进去老年代。 注意:由于新生代垃圾回收的速度高于老年代回收,因此,将年轻对象预留在新生代有利于提高整体的 GC 效率 2、大对象进入老年代 大对象占用空间多,直接放入...

大龙的博客 1万+

FPGA实现PI控制

FPGA实现PI控制

m0_57319166的博客 3897

【JVM调优】如何进行JVM调优?一篇文章就够了!

深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。

种一棵树最好的时间是十年前,其次是现在 4万+

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果: 新宋体效果: 更改颜色 当前选项卡->语法,分别单击图中的部分,然后在左边修改前景颜色就可以了。需要直接显示的修改前景颜色,背景颜色设为白色;需要选中显示的修改背景颜色,前景设为白色。 自动保存 我们有时候忘记保存或者电脑突然关机,可能会丢失代码。

魔神之云的博客 2万+

JVM调优 理论篇

主要这几个方面 内存结构、类加载机制、编译器优化、垃圾收集算法、垃圾收集器 一、内存结构 二、类加载机制 1、编译生成class文件 javac 文件名 或 idea工具编译 2、加载 读取类的二进制流 转为方法区数据结构,并存放到方法区 在java堆中产生Java.lang.class对象 3、链接(验证、准备、解析) 验证:1.验证class文件是否符合规范 文件格式的验证(是否以0XCAFEBABE开...

一朵纯洁的小白花的博客 557

RK3588平台开发系列讲解(DMA篇)DMA engine使用

Linux 内核的 DMA 引擎提供了一组完整的接口,用于申请和释放 DMA 通道、准备 DMA 描述符、启动和控制 DMA 传输,以及同步和管理缓存。通过这些接口,内核能够高效地处理异步的 DMA 传输任务,减少 CPU 的干预,提高数据传输的效率。

内核笔记 1834

JVM性能调优【二】—— 工具篇

本文总结了Java虚拟机(JVM)性能调优的常用工具,主要分为JDK内置工具和第三方工具两大类。JDK内置工具包括jps(查看JVM进程状态)、jstat(监控JVM运行状态)等监控工具,以及jinfo、jmap、jstack等故障排查工具。文章详细介绍了jps和jstat命令的使用方法、参数选项及输出信息解读,其中jstat特别适用于垃圾收集问题的定位。这些工具虽然部分被标记为"实验性",但在实际生产中非常实用。文章基于JDK 11编写,但大多数内容也适用于JDK 8,对Java开发者

qq_46601365的博客 1056

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

二、JVM结构及性能调优

一 JVM结构图 二 类加载器 1 JVM运行过程 (1).java文件编译成.class文件(也称字节码文件) (2)由类加载器对字节码文件进行:效验-准备-解析-初始化的过程,加载到JVM内存(其中class文件是运行期动态按需加载的,不是一下全部加载进内存) (3)不同操作系统的JVM版本,将字节码文件翻译成当前操作系统指令. 2 类加载器分类 (1) 启动类加载器(BootStrapCl...

oFlying1的博客 312

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JVM性能调优-二.流程步骤实践

在内存相对紧张的情况下,可以按照上述的方式来进行内存的调优, 找到一个在GC频率和GC耗时上都可接受的一个内存设置,可以用较小的内存满足当前的服务需要。但当内存相对宽裕的时候,可以相对给服务多增加一点内存,可以减少GC的频率,GC的耗时相应会增加一些。一般要求低延时的可以考虑多设置一点内存, 对延时要求不高的,可以按照上述方式设置较小内存。如果在垃圾回收日志中观察到OutOfMemoryError,尝试把Java堆的大小扩大到物理内存的80%~90%。

java领域分享 3609

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM性能调优(二)

使用jstack如何发现死锁? 使用jstack观察程序有没有死锁的时候,首先检索文件,看看有没有dead lock这些字眼, 接着就要检测有没有blacked这些字眼 使用MAT分析发现内存泄漏的问题 1.首先调用 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/administrator/james/error.hprof 然后就可...

sinat_30594513的博客 367

记第一次JVM性能调优(二)之MinorGC

jvm性能优化GC调优GC调优原则GC调优的目的调优实战 GC调优 GC调优原则 就我个人的理解而言,对于一个应用程序来说,应当存在四点调优原则 大多数的java应用都不需要GC调优 大部分需要GC优化的,不是参数问题,而是代码问题 优化代码带来的性能提升远远大于参数调整 GC调优应当是程序优化的最后手段 GC调优的目的 使GC的时间足够小.这个没有硬性的时间值,可以根据项目的不同而自由设定...

qq_33561065的博客 2313

JVM(二)性能调优

一、常见线上问题内存泄露某个进程突然cpu飙升线程死锁响应变慢二、问题定位 一般会基于数据收集来定位,而数据的收集离不开监控工具的处理,比如:运行日志、异常堆栈、GC日志、线程快照、堆快照等。经常使用恰当的分析和监控工具可以加快我们的分析数据、定位解决问题的速度。三、JVM常见监控指令 ①jps:查看java进程信息 -q 不输出类名、Jar名和传入main方法的参数 -l 输出main类或J...

zhou870498的博客 1555

JVM性能调优系列【二】垃圾回收GC调优原理

GC

qq_35789269的博客 318

Java 性能优化实战(二):JVM 调优的 5 个核心维度

文章摘要:本文深入探讨了Java应用性能优化中的JVM调优实战技巧,聚焦五个核心方向:堆内存配置、垃圾收集器选择、GC参数调优和内存泄漏诊断。通过真实案例展示了如何合理配置堆内存(-Xms/-Xmx)、调整新生代比例(NewRatio/SurvivorRatio)来减少GC频率;对比分析了G1、ZGC等主流收集器的适用场景;提供了GC参数优化建议;并详细演示了使用MAT工具诊断内存泄漏的完整流程。文章强调,合理的JVM配置能显著提升系统性能,避免内存溢出和GC频繁等问题,是连接代码与硬件性能的关键桥梁。(1

七夜zippoe的博客 1189

JVM性能调优(二):垃圾回收算法

一、Throughput收集器 1、Throughput回收算法,即为多线程回收算法, 新老代回收时均需要 stop the world       使用 -XX:+ UseParallelGC、- XX:+ UseParallelOldGC 标志启用 Throughput 收集 器。 2、Throughput回收算法,分为对新生代的Minor gc 和对老年代的full gc,其中full...

tony820418的专栏 417

Java性能优化系列二(jvm内存调优)

首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM(jvisualvm)。 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会...

拼命微笑的专栏 1483

java性能调优指南_Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述

概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少。而是要根据实际的应用程序的系统需求,实际的活跃内存等确定。正文:JVM调优工作流程整个调优过程是不断重复的一个迭代,后面的步骤有可能影响前面的配置,可能需要重新调优。应用程序的系统需求确定应用程序的系统需求是性能调优的基础,后面的调优都会依赖这个要求。一个应用不会无休止地调优下去。1.可用性2.可管理性3.启动时间4....

weixin_36308848的博客 207

Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述

概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少。而是要根据实际的应用程序的系统需求,实际的活跃内存等确定。正文: JVM调优工作流程 整个调优过程是不断重复的一个迭代,后面的步骤有可能影响前面的配置,可能需要重新调优。 应用程序的系统需求 确定应用程序的系统需求是性能调优的基础,后面的调优都会依赖这个要求。一个应用不会无休止地调优下去。 1.可用性 ...

weixin_30391339的博客 145

深入理解JVM(六)——JVM性能调优实战

如何在高性能服务器上进行JVM调优? 为了充分利用高性能服务器的硬件资源,有两种JVM调优方案,它们都有各自的优缺点,需要根据具体的情况进行选择。 1. 采用64位操作系统,并为JVM分配大内存 我们知道,如果JVM中堆内存太小,那么就会频繁地发生垃圾回收,而垃圾回收都会伴随不同程度的程序停顿,因此,如果扩大堆内存的话可以减少垃圾回收的频率,从而避免程序的停顿。 因此,人们

XINJing的专栏 422
上一篇: JVM性能调优 (一)
下一篇: JVM GC机制
lb8607
博客等级 码龄18年 17粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值