JVM运行时区域

 

方法区 Method Area

线程共享的内存区域。它在虚拟机启动时就被创建,用来存放已被虚拟机啊加载的常量、类信息、静态变量、即时编译器编译后的代码。前面三个信息具有一点java基础的同学应该都清楚,但是【即时编译器编译后的代码】可能不易被理解。即时编译器 就是JIT,它是用来编译“热点代码”的,“热点代码”就是运行特别频繁方法或代码块,虚拟机会自动识别哪些是“热点代码”。 设置方法区的大小有俩个参数:-XX:PermSize -XX:MaxPermSize 内存溢出异常后面会跟随提示信息“PermGen space”:java.lang.OutOfMemoryError:PermGen space

堆 Heap

线程共享的内存区域。这是虚拟机所管理的内存中最大的一块,它在虚拟机启动时就被创建。此区域唯一目的就是存放对象实例,几乎所有的对象以及数组都在堆中分配。Java堆是垃圾收集器(Garbage Collected)管理的主要区域,当对象实例的生命周期完成后将被垃圾收集器(Garbage Collected)所回收内存。 堆内存的大小可是设置固定或动态扩展,最小值:-Xms10M 最大值:-Xmx20M。 可以通过设置参数:-XX:+HeapDumpOnOutOfMemoryError,当出现内存溢出时Dump出当前的内存堆转存储快照以便后面分析。 内存溢出异常后面会跟随提示信息java heap space:java.lang.OutOfMemoryError:java heap space

虚拟机栈 VM Stacks

线程私有的内存区域。它的生命周期与线程相同每个方法在执行的同时都会创建一个栈帧(Stack Frame),栈帧存储局部变量表、操作数栈、动态连接、方法出口。一个方法从调用到执行完成,就对应着一个栈帧的在虚拟机栈中的入栈与出栈。局部变量表存放编译期可知的各种数据类型(boolean、byte、char、short、int 、float、long、double)、对象应用

  • 局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中,局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。

  • 操作数栈:以压栈和出栈的方式存储操作数的。

  • 动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。例如只有在程序运行的时候才能确定某变量的类型。

  • 方法返回地址:执行到那了。当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇见异常,并且这个异常没有在方法体内得到处理

虚拟机栈的大小设置:-Xss22M 虚拟机栈有俩种异常:①线程请求的栈深度大于虚拟机所允许的最大深度抛出StackOverflowError,在单线程中只会抛出此异常,我理解为当是因一个线程满足不了内存大小那么抛出此异常。②如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常后面会跟提示信息:unable to create new native thread,我理解就是创建线程获取不到足够空间则抛出此异常。

本地方法栈 Native Method Stack

它与虚拟机栈所发挥的作用时非常相似的,不同的在于本地方法栈服务的对象是Native方法。Native方法即用native关键字声明的方法,这类方法是用其它方法执行的。例如:java语言是无法创建线程的,它创建线程是使用本地方法去向计算机创建的。在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈。

程序计数器 Program Counter Register

线程私有的内存区域。它占用的内存非常小,它可以看作是当前线程所执行的字节码的行号指示器。如果线程执行的是java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是naticve方法,那这个计数器则未空(Undefined)。此区域不会抛出内存溢出异常。

直接内存

直接内存不是虚拟机内存中的一部分,但是这以内存也可能导致内存溢出。 在JDK1.4中新加入了NIO(New Input/Output)类,这是一种基于通道与缓冲区的I/O方式。它可以使用Native方法直接分配堆外内存,然后通过一个存储在堆中的对象DirectByteBuffer对象来操作这块内存。 内存大小设置:-XX:MaxDirectMemorySize=10M。如果为设置则默认与Java堆最大值(-Xmx) 一样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值