JVM内存管理:Java中常见内存泄漏案例

原创 痛定思痛。 2024-09-17 15:00 140阅读 0赞

在Java中,内存泄漏通常是指程序在申请内存后,无法释放已使用的内存空间,导致系统可用内存逐渐减少。

以下是一些常见的内存泄漏案例:

  1. 静态变量引用:如果一个静态变量被一个线程持有,那么当这个线程结束时,静态变量仍然被引用,导致内存泄漏。例如:
  1. public class StaticRefLeak {
  2. static ThreadLocal<String> local = new ThreadLocal<>();
  3. public void run() {
  4. while (true) {
  5. String value = "test";
  6. local.set(value);
  7. // 打印以验证内存使用
  8. System.out.println("Value: " + value);
  9. // 这里可以添加睡眠来模拟耗时操作
  10. try {
  11. Thread.sleep(1000); // 1秒
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. public static void main(String[] args) {
  18. Thread thread = new Thread(new StaticRefLeak().run());
  19. thread.start(); // 启动线程
  20. }
  21. }
  1. 多线程共享数据:如果多个线程同时访问和修改一个共享对象,如果没有正确同步,可能会导致内存泄漏。例如使用synchronized关键字:
  1. public class SharedObjectLeak {
  2. private Object sharedObj;
  3. public void setSharedObj(Object obj) {
  4. synchronized (this) { // 使用synchronized进行同步
  5. this.sharedObj = obj;
  6. }
  7. }
  8. // 在多线程环境中调用该方法,可能会导致内存泄漏
  9. public void useSharedObj() {
  10. Object retrievedObj = sharedObj; // 不加同步可能泄露
  11. System.out.println("Retrieved object: " + retrievedObj);
  12. }
  13. public static void main(String[] args) {
  14. SharedObjectLeak leakObj = new SharedObjectLeak();
  15. Thread thread1 = new Thread(() -> {
  16. leakObj.setSharedObj(new Object());
  17. }));
  18. Thread thread2 = new Thread(() -> {
  19. leakObj.useSharedObj(); // 这里可能会导致内存泄漏
  20. }));
  21. thread1.start();
  22. thread2.start();
  23. // 等待线程结束,这里可以添加超时时间来提高效率
  24. try {
  25. thread1.join();
  26. thread2.join();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

通过以上案例分析,了解Java内存泄漏的常见原因和解决方法。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读