当前位置: 首页 > news >正文

深入理解jvm jdk1,7(5)

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

相关文章:

  • 学会python可以上天!20行代码获取斗鱼平台房间数据,就是这么牛逼!
  • Golang 多goroutine异步通知error的一种方法
  • 前端base64加密
  • 关于kettle,表输入postgres中有jsonb字段的处理
  • Mybatis架构设计及源码分析-mapper.xml文件解析
  • AGC005 补题小结
  • Video.js的简单使用介绍
  • Bootstrap Table的 文本内容 垂直居中
  • 你的知识死角不能否定你的技术能力
  • 2019vivo开发者大会在京召开 泰迪熊移动赋能Jovi
  • 源码分析-AutoCloseable
  • VUE防抖与节流的最佳解决方案——函数式组件
  • redux和mobx比较(二)
  • 2019-05-21 SQL学习
  • Linux下编译安装PHP扩展memcached
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【面试系列】之二:关于js原型
  • Akka系列(七):Actor持久化之Akka persistence
  • centos安装java运行环境jdk+tomcat
  • C学习-枚举(九)
  • Docker容器管理
  • Redis中的lru算法实现
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • TCP拥塞控制
  • vue总结
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 聊一聊前端的监控
  • 嵌入式文件系统
  • 区块链共识机制优缺点对比都是什么
  • 使用权重正则化较少模型过拟合
  • 思维导图—你不知道的JavaScript中卷
  • 微信小程序开发问题汇总
  • 微信小程序填坑清单
  • 在weex里面使用chart图表
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $GOPATH/go.mod exists but should not goland
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (pojstep1.1.2)2654(直叙式模拟)
  • (vue)页面文件上传获取:action地址
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分类)KNN算法- 参数调优
  • (四)鸿鹄云架构一服务注册中心
  • ****Linux下Mysql的安装和配置
  • ***详解账号泄露:全球约1亿用户已泄露
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net8 Blazor 尝鲜
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • []T 还是 []*T, 这是一个问题
  • [《百万宝贝》观后]To be or not to be?
  • [20170728]oracle保留字.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...