`
什么都不懂的孩子
  • 浏览: 26799 次
社区版块
存档分类
最新评论

JVM几个运行时内存区域

 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
 
    1. 程序计数器(线程私有)
     对于JVM来说,每个Java文件都会被编译成.class文件,里面的方法,常量等等,都会被包括在内,但是运行时,如何知道目前线程运行到哪一行命令,就需要程序计数器指出来。在JVM中,多线程是通过线程轮流切换CPU的使用时间来实现,每个线程都会有一小块区域,用来记录当前所执行到的命令的位置,如果不这样的话,那么线程暂停以后,就没法知道目前命令执行到哪一条了。很好理解,这块区域属于线程的私有区域,不允许其他线程访问。
     所需要注意的是,程序计数器只记录Java方法,也就是说,它只记录虚拟机自己的字节指令,对于Native方法,这个计数器的值为空。这块区域是唯一没有规定任何OutOfMemory异常的地方。
 
    2. Java虚拟机栈(线程私有)
      这个栈是真正用来执行Java方法的区域,每当执行到一个Java方法的时候,就会创建一个栈帧,这个栈帧里面会记录局部变量、操作数栈、动态链接、方法出口和其他附加信息等等,每个方法从开始执行到执行完就是一个出栈到入栈的过程。
     在这个区域,如果线程规定了栈的深度,那么在执行方法时超出了栈的最大深度,那么就会出现StackOutflowError异常,如果虚拟机栈可以扩展,那么在扩展的时候分配不出内存,就会抛出OutOfMemoryError异常。当前大部分的虚拟机都是可以扩展的。
 
    3. Java堆(线程共享)
      对于大多数应用来说,这一块是Java内存分配管理中最大的一块,它是所有线程共享的,主要用于存储对象实例和数组。这一区域会涉及到Java的内存回收机制Garbage Colleted Heap,这个区域在不同的内存垃圾回收机制下面,会呈现不同的内存空间(不同是指是否规则,回收后是否会进行内存空间整理),当内存空间无法分配的时候抛出OutOfMemoryError
 
    4. 本地方法栈(线程私有)
      与Java虚拟机栈类似,区别在于本地方法栈用于执行Native方法,Java虚拟机栈却是执行Java字节码的地方。在虚拟机规范中没有规定对此块内存区域应该如何使用,各种虚拟机可以自由实现它。跟Java虚拟机栈一样,会抛出两种异常。
 
    5. 方法区(线程共享)
      各个线程共享,用于储存被加载的类信息、常量、静态变量、即时编译器编译的代码等数据。GC对这块内存的收集是必要而且条件苛刻的,回收主要是针对常量池和对类型的卸载。会出现OutOfMemoryError异常。
 
    6. 运行时常量池(线程共享)
      这块区域是方法去的一部分,.class文件中会有这些信息,用于存放编译时生成的各种字面量和对象的引用,在类加载完成后,放入方法区运行时常量池存放。另外一个特征就是具备动态性,所有常量并不要求在编译期产生,在运行时产生的常量也可以放入该区域,用的最多的就是String.intern()方法http://bbs.csdn.net/topics/190153906
 
    7. 直接内存
      在Java1.4中加入了NIO(New Input/Output),引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数直接在堆外面分配内存,然后用一个储存在堆里面的DirectByteBuffer对象作为这块内存的引用,能提高IO性能,可能会出现OutOfMemoryError异常。
 
 
 
 
 
 
 
 
 
 
 
 
5
4
分享到:
评论

相关推荐

    JVM自动内存管理机制

    根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括如下几个运行时数据区域程序计数器:用来记录当前线程所执行的字节码指令的行号指示器。字节码计时器需要通过改变改值来选取下一条需要执行的字节码...

    jvm-suspend-working-thread-机制:jvm暂停工作线程的机制

    JVM挂起工作线程的机制与原理首选使用Clang编译GCC编译会报错目前未研究清楚内嵌的汇编代码依赖编译后的栈上临时变量跟RBP指针的相对位置不保证编译器优化后内嵌的编译代码能正常运行怎么运行的由于编译可能产生问题...

    Java内存区域与内存溢出

    Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。  程序计数器(Program Counter Register)  ...

    Tomcat内存溢出的三种情况及解决办法分析

    这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理...

    Java 内存区域与内存溢出

    Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。下面详细阐述各数据区所存储的数据类型。  程序计数器(Program Counter Register)  ...

    java内存区域

    在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块:1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前...

    操作系统算法多语言实现.zip

    Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    创建了几个字符串对象 30 【基础】接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class) 30 【基础】一个".java"源文件中是否可以包含多个类(不是内部类...

    超级有影响力霸气的Java面试题大全文档

    创建了几个String Object? 两个 31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个...

    java 面试题 总结

    创建了几个String Object? 两个 28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ ...

    新版Android开发教程.rar

    � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...

    Loadrunner报错日志

    这个的错误的原因比较复杂,也可能很简单也可能需要查看好几个地方,解决起来不同的操作系统方式也不同。 1、首先检查是不是连接weblogic服务过大部分被拒绝,需要监控weblogic的连接等待情况,此时需要增加...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包11

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包2

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包3

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics