堆内存相关问题
来源:互联网 发布:北京seo网站排名优化 编辑:程序博客网 时间:2024/05/24 05:22
在jvm运行时区域中详细阐述了各内存的功能和分配,这里不再重复。
当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,
向上排列。当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重
新回到堆内存中。在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)
上,默认的最大堆空间和起始堆空间大小为 -Xms=3670K 和 -Xmx=64M。对于64位操作系统,一般堆空间大小增加约30%。
但你使用Java 1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。
要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK 1.5之后都支持)来查看,
在VM Summary页面可以看到最大的堆大小。
2.堆的垃圾回收
我们知道对象创建在堆内存中,垃圾回收这样一个进程,它将已死对象清除出堆空间,并将这些内存再还给堆。
堆主要分成三个区域,新生代(New Generation )、老生代(tenured generation)和永生代(Perm Generation)
New Generation是用来存放新建的对象的空间,在对象新建的时候被使用。如果长时间还使用的话,
它们会被垃圾回收器移动到Old Generation(或叫Tenured Generation)。Perm space是JVM存放Meta数据的地方,例如类,方法,
字符串池和类级别的详细信息。
当JVM启动时,使用了-Xms 参数设置的对内存。当程序继续进行,创建更多对象,JVM开始扩大堆内存以容纳更多对象。
JVM也会使用垃圾回收器来回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,
JVM就会抛出java.lang.outofmemoryerror,你的程序就会当掉。在抛出 OutOfMemoryError之前,
JVM会尝试着用垃圾回收器来释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误
Java Heap dump
Heap dump是在某一时间对Java堆内存的快照。它对于分析堆内存或处理内存泄露和Java.lang.outofmemoryerror错误是非常有用的。
在JDK中有一些工具可以帮你获取heap dump,也有一些堆分析工具来帮你分析heap dump。你可以用“jmap”来获取heap dump,它帮你创建heap dump文件,
然后,你可以用“jhat”(堆分析工具)来分析这些heap dump。
Java堆内存(heap memory)的十个要点:
1. Java堆内存是操作系统分配给JVM的内存的一部分。
2. 当我们创建对象时,它们存储在Java堆内存中。
3. 为了便于垃圾回收,Java堆空间分成三个区域,分别叫作New Generation, Old Generation或叫作Tenured Generation,还有Perm Space。
4. 你可以通过用JVM的命令行选项 -Xms, -Xmx, -Xmn来调整Java堆空间的大小。不要忘了在大小后面加上”M”或者”G”来表示单位。举个例子,你可以用 -Xmx256m来设置堆内存最大的大小为256MB。
5. 你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()来查看Java中堆内存的大小。
6. 你可以使用命令“jmap”来获得heap dump,用“jhat”来分析heap dump。
7. Java堆空间不同于栈空间,栈空间是用来储存调用栈和局部变量的。
8. Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来,再释放到Java堆空间中。
9. 当你遇到java.lang.outOfMemoryError时,不要紧张,有时候仅仅增加堆空间就可以了,但如果经常出现的话,就要看看Java程序中是不是存在内存泄露了。
10. 请使用Profiler和Heap dump分析工具来查看Java堆空间,可以查看给每个对象分配了多少内存。
- 堆内存相关问题
- 堆及相关问题
- 内存相关函数(堆)
- 内存相关:栈和堆
- NSString内存相关问题
- UIWebView内存相关问题
- 内存相关问题
- 内存泄漏相关问题
- 内存泄漏相关问题
- 栈内存与堆内存的问题。
- java内存溢出相关问题
- Android bitmap内存相关问题
- DLL内存分配相关问题
- Java内存溢出相关问题
- Androoid内存溢出相关问题
- 函数中堆内存写越界问题
- fatal error C1076编译器堆内存问题?
- java 非堆内存溢出问题
- 顺序容器操作汇总
- android项目集成sdk或者lib时, java
- [PRML] Bayesian Learning 贝叶斯学习方法
- Python生成器
- 背景建模及前景检测(三)——NBGModel
- 堆内存相关问题
- Caffe学习系列(2):数据层及参数
- css知多少(10)——display
- 移植uCOS-II到Cortex-M3平台
- 获取当前月的第一天和最后一天;获取当前周的第一天和最后一天
- java企业网站源码,模版,有前后台,springmvcSSM,生成静态化
- 007.栈应用数制转换C实例
- WhoUseMe--枚举句柄查找文件占用
- SQL Server 存储过程详解