博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解jvm jdk1,7(5)
阅读量:6508 次
发布时间:2019-06-24

本文共 1043 字,大约阅读时间需要 3 分钟。

java 虚拟机管理的内存模型包含以下几个运行时数据区域:

方法区:

方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有个别名叫做Non-Heap(非堆),目的应该是与java堆区分开。

对于习惯在HotSpot虚拟机上开发、部署程序的开发者来说,很多人都更愿意把方法去成为“永久代”,本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法去而已,这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内存,能够省去专门为方法区编写内存管理代码的工作。对于其他虚拟机来说是不存在永久代的概念的。原则上,如何实现方法区属于虚拟机的实现细节,不受虚拟机规范约束,但使用永久代来实现方法区,现在看来并不是一个好主意,因为这样更容易遇到内存溢出问题(永久代有-XX:MaxPermSize的上线,J9和JRockit只要没有触碰到进程可用内存的上限,例如32为系统的4GB,就不会出现问题),而且有极少数方法(例如String.intern())会因这个原因但是不同虚拟机下有不同的表现。因此,对于HotSpot虚拟机,根据官方发布的路线图信息,现在也有放弃永久代并逐步改为采用Native Memory来实现方法区的规划了,在JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移除。
Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个须臾是比较少出现的,但并非数据进入方法区就如同永久代的名字一样“永久”存在了。这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是必要的。在Sun公司的bug列表中,曾出现过若干个严重的bug就是由于低版本的HotSpot虚拟机对此区域未完全回收而导致内存泄漏。
根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

转载于:https://www.cnblogs.com/myDreamWillCometrue/p/10869161.html

你可能感兴趣的文章
56.随机产生的id重复问题
查看>>
一个快速检测系统CPU负载的小程序
查看>>
java.lang.IllegalArgumentException: No bean specified
查看>>
Wireshark and Tcpdump tips
查看>>
第一课 计算机及操作系统基础知识
查看>>
windows2003单域迁移到2008R2服务器
查看>>
cacti相关资料网站
查看>>
我的友情链接
查看>>
网站的开发流程介绍(转)
查看>>
java面向对象中的方法重载与方法重写的区别
查看>>
浅析:Android--Fragment的懒加载
查看>>
Linux操作系统目录和Linux常用的文件和目录管理命令
查看>>
shell运算(加、减、乘、除)
查看>>
DIY:自己动手做一个迷你 Linux 系统(二)
查看>>
猫猫学IOS(三十)UI之Quartz2D画图片画文字
查看>>
【分享】一个通用强大的主数据管理系统(架构设计讲解及源码下载)
查看>>
windows 指定的网络名不可用__被我解决了!
查看>>
asp.net 动态编译与禁止
查看>>
好程序员java教程分享+号与append的效率问题
查看>>
09值类型、引用类型、字符串
查看>>