阅读更多

8顶
0踩

编程语言

原创新闻 浅析JVM内存结构和6大区域

2015-03-20 15:58 by 副主编 mengyidan1988 评论(4) 有9623人浏览
其实对于我们一般理解的计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘。那JVM的内存结构到底是如何呢?JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域。

JVM在运行时将数据划分为了6个区域来存储,而不仅仅是大家熟知的Heap区域,这6个区域图示如下:



JVM内存的分配结构示意图


下面将逐一介绍下各个区域所做的工作及其充当的功能。
PC Register(PC寄存器)

PC寄存器是一块很小的内存区域,主要作用是记录当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变当前线程的程序计数器选取下一条字节码指令来工作的。任何分支,循环,方法调用,判断,异常处理,线程等待以及恢复线程,递归等等都是通过这个计数器来完成的。

由于java多线程是通过交替线程轮流切换并分配处理器时间的方式来实现的,在任何一个确定的时间里,在处理器的一个内核只会执行一条线程中的指令。因此为了线程等待结束需要恢复到正确的位置执行,每条线程都会有一个独立的程序计数器来记录当前指令的行号。计数器之间相互独立互不影响,我们称这块内存为“线程私有”的内存。

如果所调用的方法为native的,则PC寄存器中不存储任何信息。
JVM栈

JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址,因此Java中基本类型的变量是值传递,而非基本类型的变量是引用传递,Sun           JDK的实现中JVM栈的空间是在物理内存上分配的,而不是从堆上分配。

由于JVM栈是线程私有的,因此其在内存分配上非常高效,并且当线程运行完毕后,这些内存也就被自动回收。

当JVM栈的空间不足时,会抛出StackOverflowError的错误,在Sun JDK中可以通过-Xss来指定栈的大小,例如如下代码:
new Thread(new Runnable(){ 
           public void run() { 
              loop(0); 
           }        
           private void loop (int i){ 
              if(i!=1000){ 
                  i++; 
loop (i); 
              } 
              else{ 
                  return; 
              } 
           } 
          }).start();

当JVM参数设置为-Xss1K,运行后会报出类似下面的错误:
Exception in thread “Thread-0″java.lang.StackOverflowError

堆(Heap)

Heap是大家最为熟悉的区域,它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收,Heap在32位的操作系统上最大为2G,在64位的操作系统上则没有限制,其大小通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1G,-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大Heap的大小到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例,当空余堆内存大于70%时,JVM会将Heap的大小往-Xms指定的大小调整,可通过-XX:MaxHeapFreeRatio=来指定这个比例,但对于运行系统而言,为了避免频繁的Heap Size的大小,通常都会将-Xms和-Xmx的值设成一样,因此这两个用于调整比例的参数通常是没用的。其实jvm中对于堆内存的分配、使用、管理、收集等有更为精巧的设计,具体可以在JVM堆内存分析中进行详细介绍。

当堆中需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
方法区域(MethodArea)

方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,可见方法区域的重要性。同样,方法区域也是全局共享的,它在虚拟机启动时在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小。

运行时常量池(RuntimeConstant Pool)

类似C中的符号表,存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。类或接口的常量池在该类的class文件被java虚拟机成功装载时分配。

本地方法堆栈(NativeMethod Stacks)

JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

例如有这么一段代码:
public class A { 
                   public static void main(String[]args){ 
           String a="a"; 
          String b="b"; 
           String ab="ab"; 
           System.out.println((a+b)==ab);       // false 
           System.out.println(("a"+"b")==ab);   // true 
           final String afinal="a"; 
           String result=afinal+"b"; 
           System.out.println(result==ab);      // true 
           String plus=a+"b"; 
           System.out.println(plus==ab);        // false 
             System.out.println(plus.intern()==ab);  // true 
    } 
}

分析下上面代码执行的结果,可通过javap –verbose A来辅助理解分析。

(a+b)==ab

a+b是两个变量相加,需要到运行时才能确定其值,到运行时后JVM会为两者相加后产生一个新的对象,因此a+b==ab的结果为false。

(“a”+”b”)==ab

“a”+”b”是常量,在编译时JVM已经将其变为”ab”字符串了,而ab=”ab”也是常量,这两者在常量池即为同一地址,因此(“a”+”b”)==ab为true。

result==ab

result=afinal+”b”,afinal是个final的变量, result在编译时也已经被转变为了”ab”,和”ab”在常量池中同样为同一地址,因此result==ab为true。

plus=ab

plus和a+b的情况是相同的,因此plus==ab为false。

plus.intern()==ab

这里的不同点在于调用了plus.intern()方法,这个方法的作用是获取plus指向的常量池地址,因此plus.intern()==ab为true。

在掌握了JVM对象内存分配的机制后,接下来看看JVM是如何做到自动的对象内存回收的,这里指的的是Heap以及Method Area的回收,其他几个区域的回收都由JVM简单的按生命周期来进行管理。
  • 大小: 37.9 KB
来自: CSDN博客
8
0
评论 共 4 条 请登录后发表评论
4 楼 aindf0128 2015-05-21 13:56
挺不错,浅显易懂。
3 楼 bossjie 2015-03-24 11:04
不错,从jvm角度,分析字符串==,非常容易理解
2 楼 hsnotebook 2015-03-24 08:44
非常好, 多谢.
1 楼 _lsliang 2015-03-23 09:16
很受用,比简单的堆栈分析到位多了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 浅析JVM内存结构和6大区域(转)

    其实对于我们一般理解的...那JVM的内存结构到底是如何呢?JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域。 JVM在运行时将数据划分为了6个区域来存储,而不...

  • 浅析JVM内存结构和6大区域(转)举例非常好

    内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收、GC),...

  • 浅析jvm内存模型

    jvm主要分为:线程私有(程序计数器、虚拟机栈、本地方法栈),线程共享(方法区、堆)。程序计数器: 主要用来存放 当前线程 接下来 要执行的字节码指令、分支、循环、跳转、异常处理等信息(线程的现场信息)。

  • MiniGui业务开发基础培训-htk

    MiniGui业务开发基础培训-htk

  • com.harmonyos.exception.DiskReadWriteException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • 网络分析-Wireshark数据包筛选技巧详解及应用实例

    内容概要:本文档详细介绍了Wireshark软件中各种数据包筛选规则,主要包括协议、IP地址、端口号、包长以及MAC地址等多个维度的具体筛选方法。同时提供了大量实用案例供读者学习,涵盖HTTP协议相关命令和逻辑条件的综合使用方式。 适合人群:对网络安全或数据分析有一定兴趣的研究者,熟悉基本网络概念和技术的专业人士。 使用场景及目标:适用于需要快速准确捕获特定类型网络流量的情况;如网络安全检测、性能优化分析、教学演示等多种实际应用场景。 阅读建议:本资料侧重于实操技能提升,在学习时最好配合实际操作练习效果更佳。注意掌握不同类型条件组合的高级用法,增强问题解决能力。

  • com.harmonyos.exception.BatteryOverheatException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • com.harmonyos.exception.ServiceUnavailableException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • MATLAB上机试题 MATLAB原理及应用实验报告 第3章 MATLAB的符号运算.docx

    内容概要:本文档详细介绍了MATLAB的符号运算,涵盖符号对象的命名方法、基本运算、级数求法等多个方面。通过具体的实验案例,如确定符号表达式中的变量、执行四则运算、提取分子分母、因式分解与展开、化简符号表达式、级数符号求和、符号微积分以及符号方程的求解,帮助学生理解和掌握MATLAB中的符号运算技巧。 适合人群:适用于对MATLAB有一定了解的大专院校的学生、研究人员和技术工作者。 使用场景及目标:通过本课程的学习,学员能够熟练使用MATLAB完成复杂的数学问题解决,提高科研项目和工程任务中对数学模型的建模能力和问题解决效率。 其他说明:文档包含详细的实验步骤指导和实例演示,同时提供了丰富的练习题供读者巩固所学知识。对于想要深入研究MATLAB符号运算的人来说是一份宝贵资料。

  • springboot vue2 mysql 校园美食分享平台 论文.docx

    适合参考论文写作

  • 联通精准营销平台外呼系统HTTP接口规范

    内容概要:文档介绍了联通精准营销平台外呼系统的HTTP接口规范(V2.3),提供了API接口用于外呼业务的各种功能,确保企业的市场拓展和技术操作的无缝衔接。主要涵盖接口列表如坐席登录、数据获取、企业修改密码等,并详细说明了每个接口的方法、路径、请求参数及返回状态。针对外呼过程中的常见问题给出了处理指导,旨在帮助企业高效开展外呼业务,同时保障数据的安全性和合规性。 适用人群:适用于企业IT技术人员、营销人员以及任何希望利用电信运营商提供的API来增强自身外呼和数据分析能力的专业人士。 使用场景及目标:企业可通过这些API实现与联通平台的数据交互,包括但不限于获取客户资料、发起呼叫、管理和统计外呼数据,从而提升营销效率和客户服务体验。特别强调在外呼过程中涉及的身份认证、信息安全等方面的处理措施。 其他说明:此接口文档更新频繁,版本为2.3。企业需要及时关注最新动态以便充分利用各项功能优化营销策略。同时应注意遵守中国联通关于数据安全的相关政策法规。

  • springboot vue2 mysql 图书馆管理系统 论文.docx

    适合参考论文写作

  • java项目,课程设计-springboot校园在线拍卖系统

    java项目,课程设计-springboot校园在线拍卖系统,随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化办公。 本课题在充分研究了在Springboot框架基础上,采用B/S模式,以Java为开发语言,MyEclipse为开发工具,MySQL为数据管理平台,实现的内容主要包括首页,个人中心,综合管理等功能。

  • 全媒体运营+江苏工匠比赛

    全媒体运营+江苏工匠比赛

  • com.pureharmony.exception.CredentialValidationException.md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • com.harmonyos.exception.CloudServiceConnectionException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • com.harmonyos4.exception.VirtualMemoryAllocationException

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

  • IEC 60598-1-2020中文翻译.pdf

    IEC 60598-1-2020中文翻译

  • com.pureharmony.exception.ResourceLockException.md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

Global site tag (gtag.js) - Google Analytics