常见内存分配的问题

常见内存分配的问题

ID:32945953

大小:58.50 KB

页数:6页

时间:2019-02-18

常见内存分配的问题_第1页
常见内存分配的问题_第2页
常见内存分配的问题_第3页
常见内存分配的问题_第4页
常见内存分配的问题_第5页
资源描述:

《常见内存分配的问题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、常见内存分配的问题Tomcat内存溢岀的原因常见的一般会有下面三种情况:l.OutOfMemoryError:Javaheapspace2.OutOfMemoryError:PermGenspace3.OutOfMemoryError:unabletocreatenewnativethread・第一种:是堆溢岀没有内存泄露的情况下,调整-Xms-Xmx参数可以解决。-Xms:初始堆大小-Xmx:最大堆大小但堆的大小受下面三方面影响:1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G

2、;我在2003server系统下(物理内存:4G和6G,jdk:1.6)测试1612M,64位操作系统对内存无限制。)2•系统的可用虚拟内存限制;3.系统的可用物理内存限制。堆的大小可以使用java-Xmx***Mversion命令来测试。支持的话会出现jdk的版本号,不支持会报错。第二种:永久保存区域溢出原因分析:PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主耍是被JVM存放Class和Meta信息的‘Class在被Loader时就会被放到PermGenspac

3、e中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用屮有很CLASS的话'就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。但目前的hibernate和spring项目中也很容易岀现这样的问题。可能是由于这些框架会动态class,而且jvm的gc是不

4、会清理PemGenspace的,超过了jvm默认的大小(4M),导致内存溢出。这一个一般是加大・XX:PermSize-XX:MaxPermSize来解决问题。第三种:无法创建新的线程。这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会

5、创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdkl.4里头,默认的栈大小是256KB,但是在jdkl.5里头,默认的栈人小为每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。JVM内存组成及分配java内存组成介绍:堆(Heap)和非堆(Non-heap)内存按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在

6、Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中O堆内存分配JVM初始分配的内存由・Xms指定,默认是物理内存的1/64;JVM最大分配的内存由・Xmx指定,默认是物理内存的1/4。默认空余堆内存小

7、于40%时,JVM就会增大堆直到-Xmx的最人限制;空余堆内存大于70%时,JVM会减少堆直到・Xms的最小限制。因此服务器一般设置-Xms>-Xmx相等以避免在每次GC后调整堆的大小。对象的堆内存由称为垃圾回收器的口动内存管理系统回收。非堆内存分配JVM使ffl-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由GC策略&内存申请、对象衰老JVM里的GC(GarbageCollection啲算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等在比较常用的是分代收集(generationalcoll

8、ection,也是SUNVM使用的J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:younggeneration,tenuredgeneration和permanetgeneration。绝大部分的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。