k:java中的内存泄露及其线程状态可视化

基于jstack、jmap、jstat 进行JVM监控 通过Tomcat的jmap工具、jstat 、服务器状态页面: /manager/status,查看JVM情况。用于查询Tomcat指标的基于文本的界面。 阅读详情

@转载自:http://www.jb51.net/article/49428.htm


Q:在Java中怎么可以产生内存泄露?
A:Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和
equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。所有的内存泄露
最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露
的例子说明一下。

代码如下:

import java.util.HashMap;
import java.util.Map;

public class MemoryLeak {

 public static void main(String[] args) {
  Map<Key, String> map = new HashMap<Key, String>(1000);

  int counter = 0;
  while (true) {
       // creates duplicate objects due to bad Key class
   map.put(new Key("dummyKey"), "value");
   counter++;
   if (counter % 1000 == 0) {
    System.out.println("map size: " + map.size());
    System.out.println("Free memory after count " + counter
      + " is " + getFreeMemory() + "MB");

    sleep(1000);
   }

   
  }
 }

 // inner class key without hashcode() or equals() -- bad implementation
 static class Key {
  private String key;

  public Key(String key) {
   this.key = key;
  }

 }

 //delay for a given period in milli seconds
 public static void sleep(long sleepFor) {
  try {
   Thread.sleep(sleepFor);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }

 //get available memory in MB
 public static long getFreeMemory() {
  return Runtime.getRuntime().freeMemory() / (1024 * 1024);
 }

}

结果如下:

复制代码 代码如下:

map size: 1000
Free memory after count 1000 is 4MB
map size: 2000
Free memory after count 2000 is 4MB
map size: 1396000
Free memory after count 1396000 is 2MB
map size: 1397000
Free memory after count 1397000 is 2MB
map size: 1398000
Free memory after count 1398000 is 2MB
map size: 1399000
Free memory after count 1399000 is 1MB
map size: 1400000
Free memory after count 1400000 is 1MB
map size: 1401000
Free memory after count 1401000 is 1MB
.....
.....
map size: 1452000
Free memory after count 1452000 is 0MB
map size: 1453000
Free memory after count 1453000 is 0MB
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.util.HashMap.addEntry(HashMap.java:753)
 at java.util.HashMap.put(HashMap.java:385)
 at MemoryLeak.main(MemoryLeak.java:10)

Q:怎么解决上面的内存泄露?
A:实现Key类的equals和hasCode方法。
 

代码如下:

    .....
static class Key {
 private String key;

 public Key(String key) {
  this.key = key;
 }

 
 @Override
 public boolean equals(Object obj) {

  if (obj instanceof Key)
   return key.equals(((Key) obj).key);
  else
   return false;

 }

 @Override
 public int hashCode() {
  return key.hashCode();
 }
}
.....
重新执行程序会得到如下结果:


map size: 1

Free memory after count 1000 is 4MB
map size: 1
Free memory after count 2000 is 4MB
map size: 1
Free memory after count 3000 is 4MB
map size: 1
Free memory after count 4000 is 4MB
...
Free memory after count 73000 is 4MB
map size: 1
Free memory after count 74000 is 4MB
map size: 1
Free memory after count 75000 is 4MB
 

Q:在实际场景中,你怎么查找内存泄露?
A:通过以下代码获取线程ID

C:\>jps
5808 Jps
4568 MemoryLeak
3860 Main

通过命令行打开jconsole

C:\>jconsole 4568

实现了hasCode和equals的Key类和没有实现的图表如下所示:

没有内存泄露的:

造成内存泄露的:



JavaVisualVM可视化多线程监控分析工具v1.3.8官方安装版 Java VisualVM是一个多线程的监控分析工具,VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。功能包括内存分析、快照功能、转储功能、CPU分析等等,系统管理员可以利用它来监测、控制Java应用程序横跨整个网络的情况。 它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况, 立即下载

相关推荐

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 840

Java中的内存泄露

Q:在Java中怎么可以产生内存泄露? A:Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和 equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。所有的内存泄露 最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露 的例子说明一下。     import java.util.Has...

ruanjiana051的博客 217

BGE(BAAI General Embedding)模型详解

BGE(BAAI General Embedding)是北京智源人工智能研究院(BAAI)推出的通用文本嵌入模型系列,旨在为各种自然语言处理任务提供高质量的向量表示。

ttyy1112的专栏 7561

Java的Groovy执行器内存泄露(MetaSpace)问题分析与解决办法

内存泄漏

qq_34898847的博客 5508

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD

XC95144XL-10TQG144I 属于 Xilinx 的 XC9500XL 高性能 CPLD 家族,是一颗面向 3.3V 低电压系统的可编程逻辑器件。该器件以小封装、高速响应和良好的系统兼容性为设计目标,常用作系统控制/ glue-logic、I/O 缓冲、状态机、总线桥接与接口协议前端等场景中的可重编程逻辑单元。产品支持现场(in-system)编程与 IEEE-1149.1 JTAG 边界扫描,能在系统板上直接更新逻辑。

2403_90082736的博客 1060

JDK7,JDK8的bug,使用groovy内存泄漏

1.本文分析工具IBM HeapAnalyzer;(关于IBM HeapAnalyzer如何使用不进行阐述) 2.最终查到内存泄漏原因 https://issues.apache.org/jira/browse/GROOVY-6655 https://bugs.openjdk.java.net/browse/JDK-8037342?page=com.atlassian.jira.plu...

应用技术分享 2406

企业级AI项目落地实战指南

企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。

2509_93209761的博客 1438

一次由groovy引起的fullGC问题排查

Groovy错误的使用方式导致class对象常驻堆外内存,并随着调用频率增长,从而造成堆外内存溢出;

xiaopoze的专栏 422

用Pixhawk 2.4.8和PX4 1.13,从零搭建你的第一支无人机编队(附避坑清单)

本文详细介绍了如何使用Pixhawk 2.4.8飞控和PX4 1.13固件从零搭建低成本无人机编队系统。涵盖硬件选型、固件配置、多机通信和编队飞行逻辑开发的全流程,特别针对学生和爱好者提供实战验证的避坑方案,帮助实现多机协同飞行。

weixin_27219587的博客 403

mongodb在游戏开发领域的优势

目前游戏服务器使用mysql作为数据库的较多,然而,使用mongodb来作为存储层,在某些方面比mysql更为方便和适合。

littleschemer的博客 1700

springboot 使用GroovyShell 匿名类导致内存溢出的问题

前段时间因为在项目里用到了很多的动态值计算,由于计算项很多,计算的公式也会随着需求发生变化,于是想到了动态计算,使用 GroovyShell 脚本语言来对公式进行动态赋值,在进行运算,有很多帖子都是在讲使用 GroovyShell 会导致内存溢出,但是怎么解决这个问题貌似一直没找到,那么下面的代码可以直接拷来用了。

km233的博客 1031

AMBA-CHI协议详解(一)

CHI体系结构是一种可扩展、一致性的集线器接口和片上互联,可由多个组件使用。CHI体系结构允许根据性能、功耗和面积系统要求灵活地进行组件连接拓扑。硬件一致性使系统组件能够共享内存,而无需维护软件缓存以保持一致性。如果两个组件对同一存储器位置的写入可被所有组件以相同的顺序观察到,则存储器区域是一致的。

Crazzy_M的博客 1万+

Java线程池管理调研

Java线程池动态监控

squarebox的博客 291

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java的JVM调优知识点

通过增大Eden区的大小,来减少YGC发生的次数,但有时发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况调优。每个线程默认会开启1M的内存,用于存放栈帧、调用参数、局部变量等,但一般256k就够用,通常减少每个线程的堆栈,可以产生更多的线程,但这实际上海受限于操作系统。设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 1120

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JVM快速调优手册之七:Java程序性能分析工具JavaVisualVM(Visual GC)

VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。 在内存分析上,Java VisualVM的最大好处是可通过安装Visual GC插件来分析**GC(Gabage Col...

weixin_43267534的博客 528

jvm-47-jvm GC 日志获取方式+可视分析化工具 GcViewer

通过 GC 日志,开发者可以了解堆内存的使用情况、垃圾回收的频率、每次 GC 的时间等信息,帮助排查内存泄漏、性能瓶颈等问题。打印应用程序停顿的时间,尤其是在发生 Stop-the-World 的 GC 时,能够帮助定位性能瓶颈。GC 前后的堆使用情况:包括每个代(年轻代、老年代、元空间)的内存大小、已使用内存和最大内存。打印详细的 GC 信息,包括每个垃圾回收周期的类型、堆的使用情况、GC 前后的堆状态等。每次 GC 发生时,打印堆的详细信息(如堆内存大小、使用的内存等)。每次 GC 的执行时间。

1197

JVM调优面试题及原理

介绍JVM的调优参数、调优工具、内存泄露的排查思路、CPU飙高排查方案与思路面试题及原理

2303_81059616的博客 1037

性能调优面试题

通过增大Eden区的大小,来减少YGC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况去调优。设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。堆内存大肯定是好的,存在风险,假如发生了fullgc,它会扫描整个堆空间,暂停用户线程的时间长。堆太小,可能会频繁的导致年轻代和老年代的垃圾回收,会产生stw,暂停用户线程。

qq_41986872的博客 575

java八股文极速版

时间和空间的权衡 值越高空间开销小但是增加了查找开销服务于从Key映射到index的Hash算法,在性能和内存的使用上取平衡,实现一个尽量均匀分布的Hash函数,选取16,是通过位运算的方法进行求取的。线程安全:当多线程执行同一段程序的时候,如果发生了和预期结果不一致的情况,就是线程不安全的,如果和预期结果一致就是线程安全的,可以加锁解决(把并行运行的线程变成串行化执行)。1.加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁。

PassionAnytime的博客 382

java八股文之JVM

线程共享的区域:主要用来保存对象实例,数组等,内存不够则抛出OutOfMemoryError异常。组成:年轻代+老年代– 年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,一个对象在Eden区存活后就会放入Survivor区– 老年代主要保存生命周期长的对象,一个对象在多次Survivor区存活后就会放入老年区Jdk1.7和1.8的区别– 1.7中有有一个永久代,存储的是类信息、静态变量、常量、编译后的代码。

qq_45923849的博客 2353

java bufferedreader读大文件会内存溢出吗_JMeter内存溢出原因及解决办法

JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具,它既能测试动态服务(WebService),也能测试静态资源,包括Servlet服务、CGI脚本等,还能测试动态语言服务(PHP、Java、http://ASP.NET等)和数据库和FTP服务,测试结束之后能够根据测试的脚本配置和服务器配置情况,生成可视化的测试报告图表。本文我将以jmeter内存溢出原因及解决办法为例...

weixin_39709674的博客 1158

OOM内存溢出汇总

OOM内存溢出汇总 http://hellojava.info/?p=319 CASE1 一.出现问题 在前一段时间日常环境很不稳定,前端调用接口会出网络异常或服务不存在的异常。查询了服务器上的服务会有偶尔挂死的情况,服务器上的接口服务都不可用。于是我们对服务器上的状况进行了排查。 二.排查问题的过程 三.排查问题的步骤 1.查看服务器大概情况 首先最容易想到的是top命令,...

maso88的专栏 7607

备战面试日记(2.6) - (JVM.JVM调优)

本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试。 记录日期:2022.1.3 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习。 文章目录JVM - JVM调优JVM参数JVM参数设置方法JVM调优工具JPS、JMAP、JSTACKjconsolejvisualvm使用方式JVM调优方案调优原则调优目的调优方案调优步骤1.监控GC的状态2.分析结果,判断是否需要优化3.调整GC类型和内存分配4.不断的分析和调整5.全面应用参数调优实战如果

weixin_44414492的博客 897

hive出现内存溢出_JMeter内存溢出原因及解决办法

JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具,它既能测试动态服务(WebService),也能测试静态资源,包括Servlet服务、CGI脚本等,还能测试动态语言服务(PHP、Java、http://ASP.NET等)和数据库和FTP服务,测试结束之后能够根据测试的脚本配置和服务器配置情况,生成可视化的测试报告图表。本文我将以jmeter内存溢出原因及解决办法为例...

weixin_28706923的博客 357

JVM(三)性能调优及实战

JVM(三)性能调优及实战

folyh 1298
上一篇: K:java中的内存泄露
下一篇: K:注解简介
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值