首页 文章 精选 留言 我的

精选列表

搜索[性能],共10011篇文章
优秀的个人博客,低调大师

Java性能调优:利用VisualVM进行性能分析

来源:https://www.cnblogs.com/xifengxiaoma/p/9402497.html作者:朝雨忆轻尘 ❞ JVisualVM 简介 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。 VisualVM 提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序或远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。 双击启动 jvisualvm.exe,启动起来后和jconsole 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数。 主界面如下: VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。 如何安装: 从主菜单中选择“工具”>“插件”。 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。 逐步完成插件安装程序。 我这里以 Eclipse(pid 22296)为例,双击后直接展开,主界面展示了系统和jvm两大块内容,点击右下方jvm参数和系统属性可以参考详细的参数信息. 因为VisualVM的插件太多,我这里主要介绍三个我主要使用几个:监控、线程、Visual GC 监控的主页其实也就是,cpu、内存、类、线程的图表 线程和jconsole功能没有太大的区别 Visual GC 是常常使用的一个功能,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等。 以上的功能其实jconsole几乎也有,VisualVM更全面更直观一些,另外VisualVM非常多的其它功能,可以分析dump的内存快照,dump出来的线程快照并且进行分析等,还有其它很多的插件大家可以去探索 案例分析 准备模拟内存泄漏样例 定义静态变量HashMap 分段循环创建对象,并加入HashMap importjava.util.HashMap;importjava.util.Map;publicclassCyclicDependencies{//声明缓存对象privatestaticfinalMapmap=newHashMap();publicstaticvoidmain(Stringargs[]){try{Thread.sleep(10000);//给打开visualvm时间}catch(InterruptedExceptione){e.printStackTrace();}//循环添加对象到缓存for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("first");//为dump出堆提供时间try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("second");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<3000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("third");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<4000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("forth");try{Thread.sleep(Integer.MAX_VALUE);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("qqqq");}} 配置jvm参数如下: -Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=50m 运行程序并打卡visualvm监控 使用JVisualVM分析内存泄漏 查看Visual GC标签,内容如下,这是输出first的截图 这是输出forth的截图: 通过2张图对比发现: 老生代一直在gc,当程序继续运行可以发现老生代gc还在继续: 增加到了7次,但是老生代的内存并没有减少。说明存在无法被回收的对象,可能是内存泄漏了。 如何分析是那个对象泄漏了呢? 打开抽样器标签:点击后如下图: 按照程序输出进行堆dump,当输出second时,dump一次,当输出forth时dump一次。 进入最后dump出来的堆标签,点击类: 比较结果如下: 可以看出在两次间隔时间内TestMemory对象实例一直在增加并且多了,说明该对象引用的方法可能存在内存泄漏。 如何查看对象引用关系呢? 右键选择类TestMemory,选择“在实例视图中显示”,如下所示: 左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类CyclicDependencies里面被引用了,并且被HashMap引用。 如此可以确定泄漏的位置,进而根据实际情况进行分析解决。 JVisualVM 远程监控 Tomcat 修改远程tomcat的catalina.sh配置文件,在其中增加: JAVA_OPTS="$JAVA_OPTS-Djava.rmi.server.hostname=192.168.122.128-Dcom.sun.management.jmxremote.port=18999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false" 打开jvisualvm,右键远程,选择添加远程主机: 输入主机的名称,直接写ip,如下: 右键新建的主机,选择添加JMX连接,输入在tomcat中配置的端口即可。 双击打开。完毕! 参考资料 https://blog.csdn.net/kl28978113/article/details/53817827 https://www.cnblogs.com/ityouknow/p/6437037.html 如果本文对你有帮助, 别忘记给我个三连: 点赞,转发,评论 。 咱们下期见! 收藏等于白嫖,点赞才是真情! End 干货分享 这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取!001:《程序员必读书籍》002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》003:《互联网企业高并发解决方案》004:《互联网架构教学视频》006:《SpringBoot实现点餐系统》007:《SpringSecurity实战视频》008:《Hadoop实战教学视频》009:《腾讯2019Techo开发者大会PPT》 010:微信交流群 近期热文top 1、关于JWT Token 自动续期的解决方案 2、还不了解ETL,看看这篇文章? 3、为什么微服务需要api网关 4、架构师之路-微服务技术选型 5、RocketMQ进阶-事务消息 我就知道你“在看” 本文分享自微信公众号 - JAVA日知录(javadaily)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Nginx性能优化

1、调整worker进程数 worker_processes 4; # 设为服务器核心数 # 一个进程绑定一个核心 # worker_cpu_affinity 0001 0010 0100 1000; # 查看单个CPU核心数 # grep -c processor /proc/cpuinfo # 4 # 查看CPU总颗数 # grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l # 2 2、采用epoll模型 events { use epoll; ... 3、调整nginx单个进程运行的最大连接数 worker_rlimit_nofile 65535; # 最大打开文件数 events { worker_connections 4096; # 最大并发量=worker_connections*worker_processor ... 4、开启高效文件传输模式 http { sendfile on; tcp_nopush on; tcp_nodelay on; ... 5、调整连接超时时间 http { keepalive_timeout 60; # 客户端连接保持会话超过60秒,服务器关闭该连接 client_header_timeout 15; # 读取客户端请求头数据超过15秒,服务器返回408错误 client_body_timeout 15; # 读取客户端请求主体数据超过15秒,服务器返回408错误 send_timeout 25; # 客户端和服务器建立连接超过25秒不发送任何数据,服务器关闭该连接 ... 6、上传文件大小限制(动态应用) http { client_max_body_size 8m; ... 7、FastCGI连接参数调优 http { fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; # fastcgi_cache_path /data/ngx_fcgi_tmp; fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2; keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; ... localtion ~.*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache ngx_fcgi_cache; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_users 1; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_cache_key http://$host$reques uri; ... 8、exprires缓存优化 # expires模块控制nginx服务器应答时的Expires头内容和Cache-Control头的max-age指令,设置缓存有效期 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } 9、日志优化 # 不记录不需要的访问日志 location ~.*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; } # 降低日志目录权限 chmod -R 600 /usr/loacl/nginx/logs 10、gzip压缩优化 http { gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; ...

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册