关于JVM内存干系理论的文章,网上有很多,下面的内容是参照网络文章并结合我们实际事情中的问题做出的一些总结,重点在JVM的内存构造上,供大家参考。
公式一
JVM在我们看来,便是一个java进程,无论我们的系统利用的是tomcat、weblogic、还是websphere,系统起来后对应的便是一个java进程。这个java进程的内存组成可以粗略的用下面的公式来表示:
JAVA进程内存(或者叫作JVM内存)=堆内存+类存储内存+堆栈内存+其它内存
堆内存:便是heap内存,便是通过-Xms和-Xmx设置的那部分内存,这部分内存紧张存储java工具,例如new天生出来的工具,这部分内存可以通过垃圾回收器进行回收。
类存储内存:是专门存储java类的内存,例如系统启动时装载的第三方jar包,运用做事器本身的类,编译jsp后形成的java类等,都是存在这个区域的,这部分内存基本不会被垃圾回收器回收,只有在某些分外情形下才会被回收。不同厂商对付这部分内存的实现不尽相同,例如Sun的jdk中,是通过-XX:PermSize和-XX:MaxPermSize来设置的,而IBM的jdk则没有这个区域,而是存在堆内存中的。
堆栈内存:即stack内存,紧张用于存储线程用到的干系数据,栈中紧张存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和工具句柄。
线程堆栈内存:通过-Xss参数来指定,默认值在256KB到756KB不等,假设线程堆栈设置为-Xss512k,系统运行期间共有200个线程,那么线程堆栈总的占用内存大概便是100M,运行线程数量越多,堆栈占用内存也就越大。
其它内存:紧张包括JIT、JNI、NIO等,这些内存比较繁芜,这里不做过多先容。
公式二
上面先容的JAVA进程内存都是指用户空间的内存,除了用户空间内存,还有一部分内核空间内存,内核空间内存供操作系统利用,对付运用程序来说是透明的不可访问的。
对付上面的公式,可以进一步细化为如下公式:
JAVA进程内存=用户空间内存(堆内存+类存储内存+堆栈内存+其它内存)+内核空间内存
有了这个公式,我们在理解以下问题时就比较清晰了。
问题一:32位jdk和64位jdk的最大内请安题。
32位jdk的-Xmx值最大可以设置多大,这个问题是我们在履行过程中常常碰着的。
对付32位系统,单个进程内存的最大寻址空间为2的32次方,也便是4GB内存,个中一部分是用户空间内存,一部分是内核空间内存。对付windows系统,内核空间默认是预留2GB,用户空间最大只有2GB,用户空间除了有堆内存,还有其它类型的内存,以是-Xmx的最大值一定是小于2G,常日最大能设置到1536M。
对付linux系统,内核空间默认是预留1GB,用户空间最大可以到3GB,以是-Xmx的最大值一定是小于3G,常日至少可以设置到2048M以上。
对付64位系统,单个进程内存的最大寻址空间为2的64次方,非常大了,基本可以当作没有限定,以是-Xmx的最大值可以认为是无限大。
注:可以通过java –Xmx -version来测试最大可设置的堆内存。
问题二:内存溢出的分类及应对。
当涌现内存溢出时,首先要搞清楚是哪部分内存溢出,这样才能采纳相应的应对方法。
A.堆内存溢出
缺点日志:
java.lang.OutOfMemoryError: Java heap space
办理方案:检讨-Xmx设置是否合理;通过工具剖析javacore和heapdump定位问题。
B.类存储内存溢出
该类问题常日只涌如今sun的jdk中,缺点日志大致如下:
java.lang.OutOfMemoryError: PermGen space
办理方案:增加-XX:MaxPermSize的值。
C.堆栈内存溢出
缺点日志:
java.lang.StackOverflowError
办理方案:常日是代码中有去世循环或循环次数太多导致,也可以适当增加-Xss参数值。
D.用户空间内存溢出(也叫本机内存溢出)
缺点日志:
java.lang.OutOfMemoryError: Failed to fork OS thread
java.lang.OutOfMemoryError:requested 32756 bytes for ChunkPool::allocate.Out of swap space?
The system is out of physical RAM or swap space In 32 bit mode, the process size limit was hit.
办理方案:
1、物理内存不敷,增加物理内存。
2、Jdk的bug,升级或改换jdk。
3、物理内存充足的情形下涌现本机内存溢出,一定是在32位系统中才会涌现,最好的办理方案便是换成64位系统,如果无法改换的话只能通过适当调度JAVA用户空间内存中各组成部分的大小来考试测验办理。
例如在32位windows系统中,用户空间内存最大值为2G,堆内存-Xmx设置了1536M,这样其它非堆的内存部分只可以利用不到500M的内存,如果500M不足用的话,就会涌现本机内存溢出,这时可以将-Xmx调小,例如调小到1024M(担保够用不会涌现堆内存溢出),这样非堆的内存就增加到了1024M,问题有可能就得到办理。
关于本机内存溢出的缘故原由可能会比较繁芜,须要根据实际情形详细问题详细剖析。
通过以上总结和剖析,希望大家再次碰着内存溢出问题时能理清思路,对症下药。目前内存价格相对便宜,很多客户配置的物理内存都会超过4G,为了减少内存溢出问题的发生,可以建议用户都采取64位的操作系统,干系的jdk、运用做事器、数据库也都采取64位的,这样也可以使资源得到充分利用。
末了:1)关注+私信回答:“测试”,可以免费领取一份10G软件测试工程师口试宝典文档资料。以及相对应的视频学习教程免费分享!
,个中包括了有根本知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高等持续集成、测试架构开拓测试框架、性能测试等。
2)关注+私信回答:"入群" 就可以约请你进入软件测试群学习互换~~