首页 > 系统相关 >ThreadLocal内存泄漏实验

ThreadLocal内存泄漏实验

时间:2023-04-23 18:00:29浏览次数:48  
标签:泄漏 Java ThreadLocal 内存 new MyThreadLocal public

  1. 创建一个类,其中包含一个ThreadLocal变量,并在其中存储一个大对象。例如,以下示例创建了一个名为MyThreadLocal的类,并在其中使用ThreadLocal变量存储一个大小为10MB的字节数组:
    public class MyThreadLocal {
        private ThreadLocal<byte[]> threadLocal = new ThreadLocal<byte[]>() {
            @Override
            protected byte[] initialValue() {
                return new byte[10 * 1024 * 1024]; // 10 MB
            }
        };
    
        public byte[] getByteArray() {
            return threadLocal.get();
        }
    }

     

  1. 创建一个循环,在每次循环迭代中创建一个MyThreadLocal实例,并将其存储在List集合中。例如,以下示例创建了一个名为Main的类,并在其中创建1000个MyThreadLocal实例:
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            List<MyThreadLocal> list = new ArrayList<MyThreadLocal>();
    
            for (int i = 0; i < 1000; i++) {
                list.add(new MyThreadLocal());
            }
    
            // Do some work...
        }
    }

     

  1. 在循环结束后,强制调用System.gc()方法以尝试强制垃圾回收。请注意,垃圾回收不一定会立即发生,因此您可能需要等待一段时间才能看到内存泄漏的影响。
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            List<MyThreadLocal> list = new ArrayList<MyThreadLocal>();
    
            for (int i = 0; i < 1000; i++) {
                list.add(new MyThreadLocal());
            }
    
            System.gc(); // Force garbage collection
    
            // Do some work...
        }
    }

     

  1. 在执行一些工作之后,检查Java应用程序的内存使用情况。您可以使用Java虚拟机提供的jstat工具来监视Java应用程序的内存使用情况。例如,以下命令将每秒打印一次Java应用程序的内存使用情况:
    jstat -gcutil <pid> 1000

     

请注意,<pid>是Java应用程序的进程ID,您需要将其替换为实际的进程ID。

如果您的应用程序中存在ThreadLocal内存泄漏问题,则您将在jstat输出中看到Perm区或Metaspace区(取决于您使用的Java版本)的使用量不断增加,直到您的应用程序耗尽可用的内存并最终崩溃。

标签:泄漏,Java,ThreadLocal,内存,new,MyThreadLocal,public
From: https://www.cnblogs.com/smileblogs/p/17347315.html

相关文章

  • C++管理堆上内存
    代码中如果有使用到堆上内存,必然涉及到内存的释放时机问题,有别于python的try...finally语法,C++中要实现类似的语法则显得比较困难,因此需要另辟蹊径,用栈内存的自动释放管理堆内存的释放。思路如下,用一个类包装好堆内存的分配(构造)和释放(析构),包装类在函数中调用时均为栈......
  • 写程序分析堆内存溢出和栈内存溢出
    打jar包用命令java-jar xxx.jar写程序分析堆内存溢出packagecom.mvntest.mvn;importjava.util.ArrayList;importjava.util.List;publicclassHeapOOM{ publicstaticvoidmain(String[]args)throwsInterruptedException{ intsize=1024*1024*8; List<......
  • 记一次 .NET 某外贸ERP 内存暴涨分析
    一:背景1.讲故事上周有位朋友找到我,说他的API被多次调用后出现了内存暴涨,让我帮忙看下是怎么回事?看样子是有些担心,但也不是特别担心,那既然找到我,就给他分析一下吧。二:WinDbg分析1.到底是哪里的泄露这也是我一直在训练营灌输的理念,一定要知道是哪一边的暴涨,否则很可能就南......
  • JVM内存模型
    JVM内存模型JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。下图是jdk8jvm内存模型图:程序计数器程序计数器是当前线程所执行的字节码的行号指示器。JVM支持多个线程同时运行,每个线程都会根据CPU时间片来回切换,那么如果当前线程获得时间片了,怎么知道它......
  • 长连接Netty服务内存泄漏,看我如何一步步捉“虫”解决
    作者:京东科技王长春背景事情要回顾到双11.11备战前夕,在那个风雨交加的夜晚,一个急促的咚咚报警,惊破了电闪雷鸣的黑夜,将沉浸在梦香,熟睡的我惊醒。一看手机咚咚报警,不好!有大事发生了!电话马上打给老板:老板说:长连接吗?我说:是的!老板说:该来的还是要来的,最终还是来了,快,赶紧先把服......
  • Primo Ramdisk内存盘工具软件
    简介PrimoRamdisk软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘,在这个虚拟硬盘上的读写操作均在内存中完成。由于物理内存的访问速度远远超过物理硬盘,因此虚拟硬盘具有非常高的数据读写速度,从而突破系统IO瓶颈,飞速提升计算机性能。PrimoRamdisk具有......
  • Java中的堆内存和栈内存
    在Java中,堆内存和栈内存是两种不同的内存分配方式。堆内存堆内存用于存放由new创建的对象和数组。堆内存的分配由Java虚拟机的自动垃圾回收器来管理,因此程序员可以专注于业务逻辑的实现,无需关注内存回收的细节。Java虚拟机会自动检测哪些对象已经不再被引用,然后将其回收释放内......
  • HiveServer2 内存泄漏问题定位与优化方案
    1、前言HiveServer2属于Hive组件的一个服务,主要提供Hive访问接口,例如可通过JDBC的方式提交Hive作业,HiveServer2基于Java开发,整个服务运行过程中,内存的管理回收均由JVM进行控制。在JVM语言中的内存泄漏与C/C++语言的内存泄漏会有些差异,JVM的内存泄漏更多的是业务......
  • Windows 下主程序与动态库(*.dll)释放对方分配的内存操作要点
    同样的代码程序:主程序中释放了一块在动态库(*.dll)或共享库(*.so)中分配的内存,Windows将会出现程序崩溃,而Linux则正常运行。 在linux下,每个进程只有一个heap ,在任何一个共享库模块*.so中通过new或者malloc来分配内存的时候都是从这个唯一的heap中分配的,那......
  • IIS 内存溢出(32位程序运行)
    背景最近新接手了一个项目,服务器正常,用户量也没有变化,不定时出现内存溢出,重启iis或者回收线程就正常了review发现,因为业务原因缓存的东西并没有释放掉,但远远没有达到服务器内存上线,也没有受到预警邮件巴拉很久,发现32位系统存在内存上限为什么32位程序只能使用最大2GB内......