在java虚拟机中,整块java内存区域分为:方法区(Method Area、No-Heap)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack )、堆(Heap)、程序计数器(Program Counter Register)。
方法区 : 供所有线程共享,存储虚拟机加载的类信息、常量、静态变量、即时编译后(JIT)的 代码等。在HotSpot虚拟机实现中,方法区被当做 永久代(Permanent Generation),并通过-XX:MaxPermSize、-XX:PermSize指定方法区的内存上下限,超出这个上限将产生OutOfMemoryError。在方法区的内存分布中,有一块内存区叫做运行时常量池(Runtime Constant Pool)用于存放编辑期间产生的各种字面值和符号引用与通过翻译符号引用而得来的直接引用。
注-----在JDK7以后可能会逐渐去掉永久代这个概念。
程序计数器:线程私有的、一块比较小的内存空间,可以看做执行字节码时 的行号指示器,但是随着JIT技术的发展,程序计数器中可能为空。每一个线程都有一个程序计数器,并且他们之间互不干扰。
虚拟机栈:线程私有的,生命周期与线程一样,描述的是Java方法执行的内存模型。此处存放的数据为编辑期间可知的基本数据类型,对象引用(reference类型)。使用-Xss指定大小,注意程序中可能有很多线程在执行,所以就有n*Xss内存空间占用。
堆内存:是JVM中内存空间最大的一块,主要存储对象实例,几乎所有的内存对象都在这里进行存储。Java堆可分为:新生代和老年代。使用-Xmx与-Xms指定JVM的堆内存,其中可以使用-XX:NewRatio=2来指定堆内存中 新生代与老年代的比例,例如-XX:NewRatio=2 意味着新生代与老年代比例为1:2,所以新生代占整个堆内存的1/3.其中新生代又可以划分为:eden、To Survivor、From Survivor区域。其中虚拟机参数-XX:SurvivorRatio=4 来规定幸存区比例新生代,这里有两个幸存区,所以 幸存区的内存占用应该为(1+1)/(4+2),一个幸存区占用1/(4+2). 也可以直接指定新生代占用的内存数,通过 -Xmn参数指定。例如比较经典的:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
本地方法栈:本地方法栈中的内存是为 本地方法提供的内存空间。与jvm stack的作用类似,只是JVM Stack为字节码服务执行服务。而本地方法栈是为其他类型语言的生成的可执行文件而服务。
在调试JVM程序时,可以通过在启动JVM时,添加虚拟机参数来显示执行过程中内存细节,并在内存溢出时,启动内存转储,以便在日后进行分析定位问题。
-verbose:gc : 在虚拟机执行过程中打印出内存gc细节
-XX:+PrintGCDetails : 打印出Gc执行细节
-XX:+HeapDumpOnOutOfMemoryError :内存溢出时转储内存镜像,默认存放位置在程序根目录。
VM参数调优:
-Xmx : 堆内存占用的最大内存数 单位为k,m或者g 例如 -Xmx6m
-Xms : 堆内存启东时所占用的堆内存,是最小堆内存
-Xss : 虚拟机栈所占用的内存数
-Xmn : 指定新生代的占用内存大小
-XX:MaxPermSize : 指定永久代最大值
-XX:PermSize : 指定永久代最小占用内存值
-XX:NewRatio : 新生代与老年代占用内存的比例
-XX:SurvivorRatio : 在新生代的内存区域中,一个幸存区所占的比例
-Xnoclassgc : 设置虚拟机不回收方法区(永久代)中无用的类
-verbose:class : 查看类被加载与卸载情况
-XX:+TraceClassLoading : 查看类加载情况
-XX:+TraceClassUnLoading : 查看类卸载情况(需要FastDebug版本虚拟机支持)
-XX:+PretenureSizeThreshold=3145728 : 设置大内存对象直接进老年代的大小,此值不能使用单位后缀,只能以byte的単位形式设置,此为3MB限制
-XX:MaxTenuringThreshold=1 : 设置新生代晋级为老年代的年龄限制,一般来说,新生对象熬过一次Minor Gc 年龄就增加一岁,默认一般为15岁时进入老年代,此值可以进行管控。年龄不是进入老年代的唯一途径,为了适应更多的情况,JVM不止一种方法今生老年代。
-XX:-HandlePromotionFailure=true : 当要新生代要进行Minor Gc 时,此项如果设置允许担保的话,JVM会计算老年代连续的内存,如果内存大于新生代所有对象占用空间的总和,则JVM会进行一次Minor Gc,实行年轻代占用年老代的空间的一次Minor Gc ,否则担保失败,则会进行Full Gc。
其他辅助参数:转自(http://visionsky.blog.51cto.com/733317/566844/)
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄.如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论.
-XX:+UseParallelGC:选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收.此值最好配置与处理器数目相等.
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集.JDK6.0支持对年老代并行收集.
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.
-Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析.