Java主要管理两种类型的内存,堆内存与非堆内存(PermGen区) 我们可用jdk自带的VisualVm对其进行监控,如下图:
如图所示,jvm将内存模型区分为两块,堆(heap)非堆(permanent)区。
1、heap是运行时数据区域,所有类实例以及数组内存都在此分配,heap区分为年轻代以及年老代两大块。
1)年轻代又进一步区分为一个Eden区以及两个survivor区(from space以及to space,他们大小一样,存放每次垃圾回收之后存活的对象)Eden区用于存放jvm刚分配的对象,Eden区满的时候会触发一次普通GC,仅回收年轻代。
2)年老代主要存放生命周期较长的对象,年老代满也会触发一次Full GC,full gc回收年轻代以及年老代。
2、permanent即持久代,主要存储Java类信息,包括所有解析得到的方法、属性、字段等,不参与垃圾回收。
堆内存内存分配由 -Xms设置,初始大小为物理内存的1/64,最大内存由-Xmx设置,初始为物理内存的1/8,持久代内存大小由-XX:PermSize设置,初始大小为物理内存的
1/64,最大内存由-XX:MaxPermSize设置,初始大小为物理内存的1/4,堆内存设置太小,可能会造成频繁的垃圾回收,从而导致CPU占用率居高不下,在liunx下可以通过修改/usr/share/tomcat7/bin下的catalina.sh文件更改内存大小,在其中加入 JAVA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=512M -XX:MaxPermSize=1024M" 配置即可修改