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

公司简单网站多少钱网站建设有限公司

公司简单网站多少钱,网站建设有限公司,贵阳网站建设葫芦岛,网泰网站建设网络Java虚拟机内存模型 Java虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致#xff01; Java中通过多线程机制使得多个任务同时执行处理#xff0c;所有的线程共享JVM内存区域main memory#xff0c;而每个线程又单独的有自己的工作内存#xff0c;当线程与内存区…Java虚拟机内存模型 Java虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致 Java中通过多线程机制使得多个任务同时执行处理所有的线程共享JVM内存区域main memory而每个线程又单独的有自己的工作内存当线程与内存区域进行交互时数据从主存拷贝到工作内存进而交由线程处理操作码操作数。更多信息我们会在后面的《深入JVM—JVM类执行机制中详细解说》。 在之前我们也已经提到JVM的逻辑内存模型如下 我们现在来逐个的看下每个到底是做什么的 1、程序计数器 程序计数器Program Counter Register是一块较小的内存空间它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里仅是概念模型各种虚拟机可能会通过一些更高效的方式去实现字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的在任何一个确定的时刻一个处理器对于多核处理器来说是一个内核只会执行一条线程中的指令。因此为了线程切换后能恢复到正确的执行位置每条线程都需要有一个独立的程序计数器各条线程之间的计数器互不影响独立存储我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java 方法这个计数器记录的是正在执行的虚拟机字节码指令的地址如果正在执行的是Natvie 方法这个计数器值则为空Undefined。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。 2、Java 虚拟机栈 与程序计数器一样Java 虚拟机栈Java Virtual Machine Stacks也是线程私有的它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型每个方法被执行的时候都会同时创建一个栈帧Stack Frame ①用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 经常有人把Java 内存区分为堆内存Heap和栈内存Stack这种分法比较粗糙Java 内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块。其中所指的“堆”在后面会专门讲述而所指的“栈”就是现在讲的虚拟机栈或者说是虚拟机栈中的局部变量表部分。 局部变量表存放了编译期可知的各种基本数据类型boolean、byte、char、short、int、float、long、double、对象引用reference 类型它不等同于对象本身根据不同的虚拟机实现它可能是一个指向对象起始地址的引用指针也可能指向一个代表对象的句柄或者其他与此对象相关的位置和returnAddress 类型指向了一条字节码指令的地址。 其中64 位长度的long 和double 类型的数据会占用2 个局部变量空间Slot其余的数据类型只占用1 个。局部变量表所需的内存空间在编译期间完成分配当进入一个方法时这个方法需要在帧中分配多大的局部变量空间是完全确定的在方法运行期间不会改变局部变量表的大小。 在Java 虚拟机规范中对这个区域规定了两种异常状况如果线程请求的栈深度大于虚拟机所允许的深度将抛出StackOverflowError 异常如果虚拟机栈可以动态扩展当前大部分的Java 虚拟机都可动态扩展只不过Java 虚拟机规范中也允许固定长度的虚拟机栈当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。 3、本地方法栈 本地方法栈Native Method Stacks与虚拟机栈所发挥的作用是非常相似的其区别不过是虚拟机栈为虚拟机执行Java 方法也就是字节码服务而本地方法栈则是为虚拟机使用到的Native 方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定因此具体的虚拟机可以自由实现它。甚至有的虚拟机譬如Sun HotSpot 虚拟机直接就把本地方法栈和虚拟机栈合二为一。 与虚拟机栈一样本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError异常。 4、Java 堆 对于大多数应用来说Java 堆Java Heap是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例几乎所有的对象实例都在这里分配内存。这一点在Java 虚拟机规范中的描述是所有的对象实例以及数组都要在堆上分配①但是随着JIT 编译器的发展与逃逸分析技术的逐渐成熟栈上分配、标量替换②优化技术将会导致一些微妙的变化发生所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。 Java 堆是垃圾收集器管理的主要区域因此很多时候也被称做“GC 堆”GarbageCollected Heap幸好国内没翻译成“垃圾堆”。如果从内存回收的角度看由于现在收集器基本都是采用的分代收集算法所以Java 堆中还可以细分为新生代和老年代再细致一点的有Eden 空间、From Survivor 空间、To Survivor 空间等。如果从内存分配的角度看线程共享的Java 堆中可能划分出多个线程私有的分配缓冲区Thread LocalAllocation BufferTLAB。不过无论如何划分都与存放内容无关无论哪个区域存储的都仍然是对象实例进一步划分的目的是为了更好地回收内存或者更快地分配内存。在本章中我们仅仅针对内存区域的作用进行讨论Java 堆中的上述各个区域的分配和回收等细节将会是下一章的主题。 根据Java 虚拟机规范的规定Java 堆可以处于物理上不连续的内存空间中只要逻辑上是连续的即可就像我们的磁盘空间一样。在实现时既可以实现成固定大小的也可以是可扩展的不过当前主流的虚拟机都是按照可扩展来实现的通过-Xmx和-Xms 控制。如果在堆中没有内存完成实例分配并且堆也无法再扩展时将会抛出OutOfMemoryError 异常。 4、方法区 方法区Method Area与Java 堆一样是各个线程共享的内存区域它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分但是它却有一个别名叫做Non-Heap非堆目的应该是与Java 堆区分开来。 对于习惯在HotSpot 虚拟机上开发和部署程序的开发者来说很多人愿意把方法区称为“永久代”Permanent Generation本质上两者并不等价仅仅是因为HotSpot 虚拟机的设计团队选择把GC 分代收集扩展至方法区或者说使用永久代来实现方法区而已。对于其他虚拟机如BEA JRockit、IBM J9 等来说是不存在永久代的概念的。即使是HotSpot 虚拟机本身根据官方发布的路线图信息现在也有放弃永久代并“搬家”至Native Memory 来实现方法区的规划了。 Java 虚拟机规范对这个区域的限制非常宽松除了和Java 堆一样不需要连续的内存和可以选择固定大小或者可扩展外还可以选择不实现垃圾收集。相对而言垃圾收集行为在这个区域是比较少出现的但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载一般来说这个区域的回收“成绩”比较难以令人满意尤其是类型的卸载条件相当苛刻但是这部分区域的回收确实是有必要的。在Sun 公司的BUG 列表中曾出现过的若干个严重的BUG 就是由于低版本的HotSpot 虚拟机对此区域未完全回收而导致内存泄漏。 根据Java 虚拟机规范的规定当方法区无法满足内存分配需求时将抛出OutOfMemoryError 异常。 5、运行时常量池 运行时常量池Runtime Constant Pool是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息外还有一项信息是常量池Constant PoolTable用于存放编译期生成的各种字面量和符号引用这部分内容将在类加载后存放到方法区的运行时常量池中。 Java 虚拟机对Class 文件的每一部分自然也包括常量池的格式都有严格的规定每一个字节用于存储哪种数据都必须符合规范上的要求这样才会被虚拟机认可、装载和执行。但对于运行时常量池Java 虚拟机规范没有做任何细节的要求不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。不过一般来说除了保存Class 文件中描述的符号引用外还会把翻译出来的直接引用也存储在运行时常量池中①。 运行时常量池相对于Class 文件常量池的另外一个重要特征是具备动态性Java 语言并不要求常量一定只能在编译期产生也就是并非预置入Class 文件中常量池的内容才能进入方法区运行时常量池运行期间也可能将新的常量放入池中这种特性被开发人员利用得比较多的便是String 类的intern() 方法。 既然运行时常量池是方法区的一部分自然会受到方法区内存的限制当常量池无法再申请到内存时会抛出OutOfMemoryError 异常 6、直接内存 直接内存Direct Memory并不是虚拟机运行时数据区的一部分也不是Java虚拟机规范中定义的内存区域但是这部分内存也被频繁地使用而且也可能导致OutOfMemoryError 异常出现所以我们放到这里一起讲解。 在JDK 1.4 中新加入了NIONew Input/Output类引入了一种基于通道Channel与缓冲区Buffer的I/O 方式它可以使用Native 函数库直接分配堆外内存然后通过一个存储在Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能因为避免了在Java 堆和Native 堆中来回复制数据。 显然本机直接内存的分配不会受到Java 堆大小的限制但是既然是内存则肯定还是会受到本机总内存包括RAM 及SWAP 区或者分页文件的大小及处理器寻址空间的限制。服务器管理员配置虚拟机参数时一般会根据实际内存设置-Xmx等参数信息但经常会忽略掉直接内存使得各个内存区域的总和大于物理内存限制包括物理上的和操作系统级的限制从而导致动态扩展时出现OutOfMemoryError异常 逻辑内存模型我们已经看到了那当我们建立一个对象的时候是怎么进行访问的呢在Java 语言中对象访问是如何进行的对象访问在Java 语言中无处不在是最普通的程序行为但即使是最简单的访问也会却涉及Java 栈、Java 堆、方法区这三个最重要内存区域之间的关联关系如下面的这句代码 Object obj new Object(); 假设这句代码出现在方法体中那“Object obj”这部分的语义将会反映到Java 栈的本地变量表中作为一个reference 类型数据出现。而“new Object()”这部分的语义将会反映到Java 堆中形成一块存储了Object 类型所有实例数据值Instance Data对象中各个实例字段的数据的结构化内存根据具体类型以及虚拟机实现的对象内存布局Object Memory Layout的不同这块内存的长度是不固定的。另外在Java 堆中还必须包含能查找到此对象类型数据如对象类型、父类、实现的接口、方法等的地址信息这些类型数据则存储在方法区中。 由于reference 类型在Java 虚拟机规范里面只规定了一个指向对象的引用并没有定义这个引用应该通过哪种方式去定位以及访问到Java 堆中的对象的具体位置因此不同虚拟机实现的对象访问方式会有所不同主流的访问方式有两种使用句柄和直接指针。 句柄池 如果使用句柄访问方式Java 堆中将会划分出一块内存来作为句柄池reference中存储的就是对象的句柄地址而句柄中包含了对象实例数据和类型数据各自的具体地址信息如下图所示。 如果使用直接指针访问方式Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息reference 中直接存储的就是对象地址如下图所示 这两种对象的访问方式各有优势使用句柄访问方式的最大好处就是reference 中存储的是稳定的句柄地址在对象被移动垃圾收集时移动对象是非常普遍的行为时只会改变句柄中的实例数据指针而reference 本身不需要被修改。 使用直接指针访问方式的最大好处就是速度更快它节省了一次指针定位的时间开销由于对象的访问在Java 中非常频繁因此这类开销积少成多后也是一项非常可观的执行成本。就本书讨论的主要虚拟机Sun HotSpot 而言它是使用第二种方式进行对象访问的但从整个软件开发的范围来看各种语言和框架使用句柄来访问的情况也十分常见。 下面我们来看几个示例 1、Java 堆溢出 下面的程中我们限制Java 堆的大小为20MB不可扩展将堆的最小值-Xms 参数与最大值-Xmx 参数设置为一样即可避免堆自动扩展通过参数-XX:HeapDumpOnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储快照以便事后进行分析。 参数设置如下 分享 这次面试我也做了一些总结确实还有很多要学的东西。相关面试题也做了整理可以分享给大家了解一下面试真题想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止 需要这份资料的朋友戳这里免费下载整理出的内容大概如下 Spring Cloud实战 Spring Boot实战 863508997)] Spring Cloud实战 [外链图片转存中…(img-dJGn9yuL-1626863508997)] Spring Boot实战 [外链图片转存中…(img-Fnjeme7B-1626863508998)] 面试题整理性能优化微服务并发编程开源框架分布式
http://www.yutouwan.com/news/381809/

相关文章:

  • 山东省建设局网站深圳公共资源交易平台
  • 机械设计网站有哪些北京广告设计公司排名
  • 外贸在哪些网站开发客户苏州网站建设最佳方案
  • 政务公开与网站建设c 网站开发
  • 上海优秀网站建设公司html可以做网站分页
  • 网站服务器主机配置企业策划书格式及范文
  • 江门做公司网站查做外贸客户的网站
  • 如何开发网站自己做站长wordpress文章末尾添加相关文章
  • 搜索网站的浏览器杭州做商务网站
  • 益阳房地产网站建设那个做图网站叫什么
  • 设计工作网站微信h5制作
  • 网站设计中新闻版块怎么做快速做自适应网站
  • 济宁房产网站建设成都网站建设 天空在线
  • 免费网站加速服务网站数据库购买
  • 怎样可以快速增加网站的反链个人公众号如何推广
  • django mysql网站开发今天特大新闻最新消息
  • 网站app服务器租用老薛主机做电影网站
  • 校园网站建设先进黄页公司
  • 网站开发职业企业注册类型
  • 如何做网站实名认证北京新网数码信息技术有限公司
  • 网站建设行业税率网站建设内容录入论文
  • 合肥微信网站建设正定seo
  • 网站建设流程图visio外国大气网站
  • 网站制作网站建设项目规划书怎样用FW做网站的首页
  • 聊城网站建设开发分类目录是什么意思
  • 旅游网站开发设计江津区网站建设
  • 网站备案表格样本上网用哪家公司的比较好
  • 余干网站建设制作网站改版案例
  • 长沙微网站建设公司用模板怎么做网站
  • asp.net网站开发实例教程pdf网站建设与搜索