`

第七章 java堆

    博客分类:
  • jvm
 
阅读更多

 

 java堆

一.内存溢出的原因

     

    1.堆溢出

        当堆中强引用对象占用了大部分空间,导致内存无法回收,对象大小之和大于-Xmx就会导致堆溢出.

    2.直接内存溢出

        下面的代码申请直接内存,导致直接内存溢出 . 当JAVA进程的所有内存之和(堆空间,栈空间,直接内存,以及虚拟机自身所用的内存)大于-Xmx *2的时候,就会出现OOM.

         

-Xmx1g -XX:+PrintGCDetails  (32位虚拟机,用户空间为2GB)  	 
for(int i = 0 ;i< 1024;i++){ 
            ByteBuffer b = ByteBuffer.allocateDirect(1024*1024);
  } 

      3.过多线程导致OOM

 

       

-Xmx1g -XX:+PrintGCDetails  
public static class OOMThread implements Runnable{
    public void run(){
       Thread.sleep(10000000);
    }
}  	 

public static void main(String[] args) {

  for(int i = 0 ;i< 100000;i++){ 
          new Thread(new OOMThread()).start();
  } 
}

       有两种方法可以解决

      1.减小堆空间大小 -Xmx. 2.减小每个线程所占用的线程空间  -Xss

 

    4.永久去溢出

      -XX:PermSize,然后不断的产生新类,用cglib

 

    5.GC效率地下导致OOM

         1.GC的时间超过98%.

         2.老年代释放内存小于2%

         3.eden区释放的内存小于2%

         4.连续5次出现上诉条件.就会抛出 GC overhead limit exceeded

 

 

二. String 在虚拟机中的实现

 

       1.不变性

          一旦生成一个String对象,就不能进行改变.主要作用于多线程访问时, 省略同步的时间,提高性能.String的一些看起来是修改的操作,实质上都是通过新建字符串对象来实现的.

       2.针对常量池的优化

         当两个字符串拥有相同的值时,它们指向常量池的同一个拷贝.这样可以大量节省内存空间.

         

                String str1 = new String("abc");
		String str2 = new String("abc");
		System.out.println(str1.intern() == str2.intern());//true

       

 

 

       3.String常量池的位置

 

        在虚拟机中,有一块称为常量池的区间专门用于存放字符串常量.jdk1.6之前,这块区域属于永久区,jdk1.7之后被移动到堆中进行管理.

        String.intern()方法返回常量池中的字符串,如果不存在就放入常量池.

        下面的程序可以看出jdk1.6是在永久区,1.7之后是在堆中

 

jdk1.8:-Xmx5m -XX:MaxMetaspaceSize=5m -XX:-UseGCOverheadLimit
jdk1.6:-Xmx5m -XX:MaxPermSize=5m 
jdk1.7:-Xmx5m -XX:MaxPermSize=5m
public static void main(String[] args) {
		List<String> test  = new ArrayList<String>();
		for(int i = 0 ;i< 100000;i++){
			test.add(String.valueOf(i).intern());
		}
	}

        

 

 

 三.使用MAT分析java堆

       

      打开eclipse中的Memory Analysis试图,用菜单File ->Acquire Heap Dump  选择要分析的堆.生成分析数据

     

 

     这个试图里面可以观察到堆快照里类大小,类,实例,所有类的内存使用情况,线程以及线程内局部变量的信息.

     

 

 


  

 

 

  • 大小: 117.3 KB
  • 大小: 277.5 KB
  • 大小: 306.5 KB
  • 大小: 391.7 KB
  • 大小: 674 KB
分享到:
评论

相关推荐

    java第18章java-chapter18.rar

    在这个"java第18章java-chapter18.rar"压缩包中,我们可能会探讨到Java的核心概念、进阶话题以及可能的实战案例。 1. **并发处理**:Java提供了丰富的并发工具,如线程、守护线程、线程池、同步机制(synchronized...

    Java程序设计与数据结构第九章习题答案

    6. **排序和查找算法**:第九章可能涉及各种排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,以及查找算法如顺序查找、二分查找等。习题可能要求实现这些算法并分析其效率。 7. **递归与...

    Java程序设计与数据结构第六章习题答案

    在Java程序设计与数据结构的学习过程中,第六章通常会涵盖数据结构的重要概念和应用,以及如何用Java语言来实现它们。这一章的内容可能包括数组、链表、栈、队列、树、图等基础数据结构,也可能涉及排序和查找算法。...

    《Java语言程序设计(进阶篇)》 课后习题第25章代码chapter25.rar

    在本压缩包“chapter25.rar”中,包含的是《Java语言程序设计(进阶篇)》一书的第25章课后习题的源代码。这是一份宝贵的资源,对于正在学习Java编程,尤其是深入阶段的学生来说,是提高编程技能和理解Java高级特性...

    Java程序设计与数据结构第八章习题答案

    以上知识点会在Java程序设计与数据结构的第八章习题中得以体现,通过解答这些习题,学习者可以深化对Java编程和数据结构的理解,提升编程技能。在解答过程中,应注重代码的清晰性、效率和错误处理,同时理解并运用...

    java第10章java-chapter10.rar

    本章“java第10章”将深入探讨Java的一些核心概念和技术,旨在帮助开发者进一步提升其Java编程技能。 在Java的世界中,第10章通常可能涵盖以下关键知识点: 1. **异常处理**:Java提供了异常处理机制来处理运行时...

    《Java语言程序设计(进阶篇)》 课后习题第23章代码chapter23.rar

    《Java语言程序设计(进阶篇)》是深入学习Java编程的一本教材,其第23章的内容可能涉及了高级Java特性和编程实践。在这个压缩包"chapter23.rar"中,我们很可能会找到与这一章节相关的源代码示例,用于帮助读者理解...

    Java程序设计与数据结构第五章习题答案

    综上所述,Java程序设计与数据结构第五章的学习涵盖了基础数据结构的理论知识和实践应用,通过习题解答,可以帮助学生巩固理解,提高编程技能。提供的代码参考将有助于学习者更好地掌握这些概念,并能够运用到实际...

    JAVA语言程序设计 第五章 数组

    在Java中,数组对象存储在堆内存中,而数组元素的引用存储在栈内存。理解这一点有助于理解内存分配和垃圾回收机制。 总之,Java中的数组是编程中不可或缺的结构,它提供了高效的数据组织方式。通过熟练掌握数组的...

    java第12章java-chapter12.rar

    第12章的学习通常会涵盖Java的一些高级特性或特定主题,如多线程、网络编程、I/O流、集合框架、异常处理等。以下是基于这个章节可能涉及的一些关键知识点的详细解释: 1. **多线程**:Java提供了一种并发执行任务的...

    java虚拟机规范(java SE7)

    第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化

    深入java虚拟机中文第2版

    第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally...

    第1章 Java基础 .docx

    7. **面向对象**:Java支持封装、继承和多态,使得开发者能以面向对象的方式组织和设计代码。 理解这些核心概念是掌握Java编程的基础,通过深入学习,开发者不仅可以编写出高效、可靠的程序,还能灵活应对各种应用...

    java2实用教程

    第七章:AWT工具集简介 介绍了Java的抽象窗口工具集(AWT),它用于创建基本的图形用户界面。 第八章:JAVAAPPLET基础 讲解了Java Applet的基本知识,包括Applet的生命周期、与HTML页面的关系等。 第九章:文本框...

    Java语言程序设计与数据结构(基础篇)第6章课后习题代码chapter6.rar

    在本资源"Java语言程序设计与数据结构(基础篇)第6章课后习题代码chapter6.rar"中,我们聚焦于Java编程语言与数据结构的结合应用,特别是在解决实际问题时的基础技巧。第六章通常会涵盖一些核心的编程概念和数据...

    实战JAVA虚拟机

    第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行...

    JavaWeb应用开发原理与技术第7章.ppt

    【JavaWeb应用开发原理与技术第7章】深入解析Java的多线程机制 JavaWeb应用开发中,多线程机制扮演着至关重要的角色。在第7章中,我们将探讨多线程的基本概念、实现方式以及如何管理和控制线程的行为。 ### 7.1 ...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第7章 类型的生命周期 7.1 类型装载、连接与初始化 7.1.1 装载 7.1.2 验证 7.1.3 准备 7.1.4 解析 7.1.5 初始化 7.2 对象的生命周期 7.2.1 类实例化 7.2.2 垃圾收集和对象的终结 7.3 ...

    实战java虚拟机

    第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行...

    《Java语言程序设计(进阶篇)》 课后习题第27章代码chapter27.rar

    《Java语言程序设计(进阶篇)》是深入学习Java编程的一本重要教材,而第27章的课后习题通常涵盖了高级特性和实践应用,对于提升编程技能至关重要。这个压缩包“chapter27.rar”包含了该章节的源代码示例,帮助读者...

Global site tag (gtag.js) - Google Analytics