
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
堆和方法区是程序员在学习Java编程开发语言的时候需要重点掌握的一个Java编程内存管理方法,下面我们就通过案例分析来简单了解一下,Java编程堆与方法区的区别都有哪些。
1.堆(Heap)
堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。
堆是java虚拟机所管理的内存中大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。
其大小通过-Xms(小值)和-Xmx(大值)参数设置(大小值都要小于1G),前者为启动时申请的小内存,默认为操作系统物理内存的1/64,后者为JVM可申请的大内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大堆内存到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小堆内存的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,当然为了避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。堆内存=新生代+老生代+持久代。
在我们垃圾回收的时候,我们往往将堆内存分成新生代和老生代(大小比例1:2),新生代中由Eden和Survivor0,Survivor1组成,三者的比例是8:1:1,新生代的回收机制采用复制算法,在MinorGC的时候,我们都留一个存活区用来存放存活的对象,真正进行的区域是Eden+其中一个存活区,当我们的对象时长超过一定年龄时(默认15,可以通过参数设置),将会把对象放入老生代,当然大的对象会直接进入老生代。老生代采用的回收算法是标记整理算法。
2.方法区(MethodArea)
方法区也称”永久代“,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认小值为16MB,大值为64MB(64位JVM由于指针膨胀,默认是85M),可以通过-XX:PermSize和-XX:MaxPermSize参数限制方法区的大小。
它是一片连续的堆空间,永久代的垃圾收集是和老年代(oldgeneration)捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。不过,一个明显的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误。参数是通过-XX:PermSize和-XX:MaxPermSize来设定的。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。