课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存的管理与优化是每一位Java编程开发程序员都需要重点掌握的一个编程知识点,而本文我们就通过案例分析来简单了解一下,Java编程内存运行区域划分都有哪些类型。
Java堆(Heap)
类实例和数组存储在堆内存中。堆内存也称为共享内存。因为这是多个线程将共享相同数据的地方。
Java堆(JavaHeap)的作用就是存放对象实例,几乎所有的对象实例都是在这里分配内存。
Java堆是垃圾收集的主要区域(因此也被叫做"GC堆")。现代的垃圾收集器基本都是采用分代收集算法,该算法的思想是针对不同的对象采取不同的垃圾回收算法。
因此虚拟机把Java堆分成以下三块:
新生代(YoungGeneration)
Eden-Eden和Survivor的比例为8:1
FromSurvivor
ToSurvivor
老年代(OldGeneration)
永久代(PermanentGeneration)
当一个对象被创建时,它先进入新生代,之后有可能被转移到老年代中。新生代存放着大量的生命很短的对象,因此新生代在三个区域中垃圾回收的频率高。
注意:Java堆不需要连续内存,并且可以动态扩展其内存,扩展失败会抛出OutOfMemoryError异常。
方法区
方法区(MethodArea)也被称为永久代。方法区用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。
和Java堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出OutOfMemoryError异常。JDK1.7之前,HotSpot虚拟机把它当成永久代来进行垃圾回收。可通过参数-XX:PermSize和-XX:MaxPermSize设置。JDK1.8之后,取消了永久代,用**metaspace(元数据)**区替代。可通过参数-XX:MaxMetaspaceSize设置。
运行时常量池
运行时常量池(RuntimeConstantPool)是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池(ConstantPoolTable),用于存放编译器生成的各种字面量和符号引用,这部分内容会在类加载后被放入这个区域。
字面量-文本字符串、声明为final的常量值等。
符号引用-类和接口的完全限定名(FullyQualifiedName)、字段的名称和描述符(Descriptor)、方法的名称和描述符。除了在编译期生成的常量,还允许动态生成,例如String类的intern()。这部分常量也会被放入运行时常量池。
直接内存
直接内存(DirectMemory)并不是虚拟机运行时数据区的一部分,也不是JVM规范中定义的内存区域。
在JDK1.4中新加入了NIO类,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。