Java堆内存的10个要点
发布时间:2025-05-19 11:20:12 发布人:远客网络
一、Java堆内存的10个要点
1、当我开始学习Java编程时我不知道什么是堆内存或堆空间我甚至不知道当对象创建时它们被放在了哪里当我开始正式写一些程序后我会经常遇到java lang outOfMemoryError的报错之后我才开始关注什么是堆内存或者说堆空间(heap space)对大多数程序员都经历过这样的过程因为学习一种语言是非常容易来的但是学习基础是非常难的因为没有什么特定的流程让你学习编程的每个基础使你发觉编程的秘诀
2、对于程序员来说知道堆空间设置堆空间处理堆空间的outOfMemoryError错误分析heap dump是非常重要的这个关于Java堆的教程是给我刚开始学编程的兄弟看的如果你知道这个基础知识或者知道底层发生了什么当然可能帮助不是那么大除非你知道了对象被创建在堆中否则你不会意识到OutOfMemoryError是发生在堆空间中的我尽可能的将我所知道的所有关于堆的知识都写下来了也希望你们能够尽可能多的贡献和分享你的知识以便可以让其他人也受益
3、当Java程序开始运行时 JVM会从操作系统获取一些内存 JVM使用这些内存这些内存的一部分就是堆内存堆内存通常在存储地址的底层向上排列当一个对象通过new关键字或通过其他方式创建后对象从堆中获得内存当对象不再使用了被当做垃圾回收掉后这些内存又重新回到堆内存中要学习垃圾回收请阅读 Java中垃圾回收的工作原理
4、在大多数位机 Sun的JVM上 Java的堆空间默认的大小为 MB但也有例外例如在未Solaris操作系统(SPARC平台版本)上默认的最大堆空间和起始堆空间大小为 Xms= K和 Xmx= M对于位操作系统一般堆空间大小增加约%但你使用Java的throughput垃圾回收器默认最大的堆大小为物理内存的四分之一而起始堆大小为物理内存的十六分之一要想知道默认的堆大小的方法可以用默认的设置参数打开一个程序使用JConsole(JDK之后都支持)来查看在VM Summary页面可以看到最大的堆大小
5、用这种方法你可以根据你的程序的需要来改变堆内存大小我强烈建议采用这种方法而不是默认值如果你的程序很大有很多对象需要被创建的话你可以用 Xms and Xmx这两个参数来改变堆内存的大小 Xms表示起始的堆内存大小 Xmx表示最大的堆内存的大小另外有一个参数 Xmn它表示new generation(后面会提到)的大小有一件事你需要注意你不能任意改变堆内存的大小你只能在启动JVM时设定它
6、我们知道对象创建在堆内存中垃圾回收这样一个进程它将已死对象清除出堆空间并将这些内存再还给堆为了给垃圾回收器使用堆主要分成三个区域分别叫作New Generation Old Generation或叫Tenured Generation以及Perm space New Generation是用来存放新建的对象的空间在对象新建的时候被使用如果长时间还使用的话它们会被垃圾回收器移动到Old Generation(或叫Tenured Generation) Perm space是JVM存放Meta数据的地方例如类方法字符串池和类级别的详细信息你可以查看 Java中垃圾回收的工作原理来获得更多关于堆和垃圾回收的信息
7、 Java堆中的OutOfMemoryError错误
8、当JVM启动时使用了 Xms参数设置的对内存当程序继续进行创建更多对象 JVM开始扩大堆内存以容纳更多对象 JVM也会使用垃圾回收器来回收内存当快达到 Xmx设置的最大堆内存时如果没有更多的内存可被分配给新对象的话 JVM就会抛出java lang outofmemoryerror你的程序就会当掉在抛出 OutOfMemoryError之前 JVM会尝试着用垃圾回收器来释放足够的空间但是发现仍旧没有足够的空间时就会抛出这个错误为了解决这个问题你需要清楚你的程序对象的信息例如你创建了哪些对象哪些对象占用了多少空间等等你可以使用profiler或者堆分析器来处理 OutOfMemoryError错误 java lang OutOfMemoryError Java heap space表示堆没有足够的空间了不能继续扩大了 java lang OutOfMemoryError PermGen space表示permanent generation已经装满了你的程序不能再装在类或者再分配一个字符串了
9、 Heap dump是在某一时间对Java堆内存的快照它对于分析堆内存或处理内存泄露和Java lang outofmemoryerror错误是非常有用的在JDK中有一些工具可以帮你获取heap dump也有一些堆分析工具来帮你分析heap dump你可以用 jmap来获取heap dump它帮你创建heap dump文件然后你可以用 jhat(堆分析工具)来分析这些heap dump
10、 Java堆内存(heap memory)的十个要点
11、 Java堆内存是操作系统分配给JVM的内存的一部分
12、当我们创建对象时它们存储在Java堆内存中
13、为了便于垃圾回收 Java堆空间分成三个区域分别叫作New Generation Old Generation或叫作Tenured Generation还有Perm Space
14、你可以通过用JVM的命令行选项 Xms Xmx Xmn来调整Java堆空间的大小不要忘了在大小后面加上 M或者 G来表示单位举个例子你可以用 Xmx m来设置堆内存最大的大小为 MB
15、你可以用JConsole或者 Runtime maxMemory() Runtime totalMemory() Runtime freeMemory()来查看Java中堆内存的大小
16、你可以使用命令 jmap来获得heap dump用 jhat来分析heap dump
17、 Java堆空间不同于栈空间栈空间是用来储存调用栈和局部变量的
18、 Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来再释放到Java堆空间中
19、当你遇到java lang outOfMemoryError时不要紧张有时候仅仅增加堆空间就可以了但如果经常出现的话就要看看Java程序中是不是存在内存泄露了
二、北大青鸟java培训:java编程内存管理需要注意的问题
1、大家在进行程序系统维护的时候是否因为java编程的内存管理问题而无法快速解决导致系统出错呢?下面我们就一起来了解和学习一下,关于java编程内存管理都有哪些知识点。
2、程序计数器(了解)程序计数器,可以看做是当前线程所执行的字节码的行号指示器。
3、在虚拟机的概念模型里,字节码解释器工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。
4、Java虚拟机栈(了解)Java虚拟机栈也是线程私有的,它的生命周期与线程相同。
5、虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口信息等。
6、每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
7、局部变量表中存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。
8、如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
9、本地方法栈(了解)本地方法栈与虚拟机的作用相似,不同之处在于虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。
10、有的虚拟机直接把本地方法栈和虚拟机栈合二为一。
11、会抛出stackOverflowError和OutOfMemoryError异常。
12、Java堆堆内存用来存放由new创建的对象实例和数组。
13、(重点)Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的目的就是存放对象实例。
14、Java堆是垃圾收集器管理的主要区域。
15、java课程培训机构发现由于现在收集器基本采用分代回收算法,所以Java堆还可细分为:新生代和老年代。
16、从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。
三、java语言的所有数据类型分为哪几种
JAVA中一共有八种基本数据类型,分别是:byte、short、int、long、float、double、char、boolean。
1、byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
2、short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
3、int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
4、long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
5、float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
6、double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
7、boolean:只有true和false两个取值。
8、char:16位,存储Unicode码,用单引号赋值。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。