java内存区域探析

原创 2012年03月29日 20:57:01

      在C/C++开发中,自己需要进行内存管理,而java由于JVM的自动内存管理机制的帮助,不在需要为每一个new操作写配对的delete和free代码了,但由于内存泄露和益出方面的问题,在这小结下java内存区域中的一些知识。

    java虚拟机运行时数据区如下:


主要包括五个部分:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(运行时常量池)。

(1)程序计数器(线程私有):

    程序计数器是一块较小的内存空间,它的作用可以看做事当前线程所执行的字节码的行号指示器。如执行字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能。

   JVM一次能支持很多线程执行。每一个JVM线程有它自己的程序计数器。在任何时候,一个JVM的线程都正在执行当前线程的方法代码。如果这个方法是一个java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果线程正在执行本地方法,程序计数器的值为未定义。JVM程序计数器足以存储一个返回地址或一个本地指针。


(2)java虚拟机栈(线程私有):

    每个JVM的线程在创建的时候,都会创建一个栈。一个栈包含很多栈桢。栈帧用来存储局部变量表(存放了编译器的各种基本数据类型如boolean、byte、char、short、int、float、long、double;对象引用(不同虚拟机存储的不同如指向对象起始地址的引用指针或者是代表对象的句柄);returnaddress类型)、操作栈、动态链接、方法出口等信息。

  在java虚拟机规范中,对这个区域规定了两种异常状况:

      a。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

      b.如果VM栈可以动态扩展,当扩展时无法申请到足够内存(或者在初始化新线程时没有足够内存在创建栈)则抛出OutOfMemoryError异常。


(3) 本地方法栈:

    本地方法栈和java虚拟机栈的作用类似。只是java虚拟机栈为执行java方法(也就是字节码)服务,本地方法栈则为虚拟机使用到的native方法服务。

  在java虚拟机规范中,对这个区域规定了两种异常状况:

      a。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

      b.如果VM栈可以动态扩展,当扩展时无法申请到足够内存(或者在初始化新线程时没有足够内存在创建栈)则抛出OutOfMemoryError异常。


 (4)java堆

       JVM有一个在所有线程内共享的堆。堆是给所有类的实例和数组分配内存的运行时数据区。 堆在虚拟机启动的时候创建,堆中储存的对象通过一个自动存储管理系统(垃圾回收器)进行回收。 对象从不明确的被分配(JVM从不指明对象的释放)。JVM加上没有(JVM不指定特定的自动存储管理系统)自动存储管理系统的特别的类型,(开发者可根据系统要求自主选择)并且这个存储管理技术可能被选择按照实现的系统需求。

    java堆是垃圾收集器管理的主要区域,也被称为“GC堆”。

      堆要么是固定大小,要么按计算需要扩展。如果一个大的堆变得多余或许会收缩。堆的内存不需要相邻。使用者可以设置堆内存的大小,如果堆能够动态的扩展。控制最大最小堆内存。

堆会出现以下异常:

    如果内存溢出(若计算所需堆内存不足),则抛出OutOfMemoryError


(5)方法区

      JVM的方法区是所有线程共享的,方法区类似于传统语言编译代码时的存储区域或类似于操作系统进程的文本段。他存储内容包括:每一个类的结构,如运行时常量池,字段和方法的数据;方法和构造器的代码,如用于类,实例和接口初始化的特殊方法。这个方法区在JVM启动的时候被创建,一般情况下JVM不会选择对方法区进行垃圾回收或者压缩,这个版本的JVM规范没有强制规定方法区的位置和管理编译后代码的策略。方法区可固定大小,或按需伸缩。方法区的内存不需要相邻。

   运行时常量池(方法区的一部分):

      运行时常量池是类和接口运行时的常量池表,它在字节码文件里。它包含几类常量。 在编译时期识别的数值常量,在运行区识别的方法或引用字段。运行区常量池类似于传统语言的字符表,但它比传统字符表所存储的范围更广。每一个运行区常量池从方法区分配内存。当类和接口被JVM创建时相应的常量池也被创建。
       运行区常量池包括以下异常:

  当类和接口创建时,如果运行区常量池所需内存不足,则抛出OutOfMemoryError。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java内存区域

注:初学Java虚拟机,参考书籍《深入理解Java虚拟机》  最近,在学习spring框架,看书看的是云里雾里的,感觉看不下去了…..于是,就决定和其其我的他的知识换着来学,所以,就有了下面这篇博客....

Java内存区域

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人想出来。 运行时数据区域:   Java虚拟机在执行Java程序的过程中会把它所管理的内存划...

Java内存区域模型、对象创建过程、常见OOM

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。最近开始看这本书,打算再开一个相关系列,来总结一下这本书中的重要知识点。呃呃呃,说好的那个图片请求框架呢~  不要急哈,因...

Java 内存区域和GC机制

目录 Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器 Java垃圾回收概况   Java GC(Garbage Colle...

深入Java内存区域与OOM

概述: 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任。 ...

Java内存区域和对象布局

Java和c系列语言最大的区别就是Java将内存纳入虚拟机管理之下,内存的分配和释放程序员不再“关心”。但是这个不“关心”是个伪命题,它表现的只是代码中不再去直接分配和释放内存,只有对虚拟机如何管理...

Java 内存区域 详解

Java虚拟机在执行Java程序的过程中会把它所管理的内存区域分为若干个不同的数据区域。这些区域都有各自的用途,有的区域随虚拟机进程启动而存在,有的区域则依赖用户线程启动和结束而建立和销毁。根据《Ja...

Java内存区域

本文引用自:《深入理解Java虚拟机》的第2章内容 java的内存区域可以大致划分成两类: 所有线程共享的数据区:方法区(Method Area)和堆(Heap)线程隔离的数据区:虚拟机栈(V...

JAVA内存区域--OOM(outofmemory)异常

堆溢出异常堆栈信息:java.lang.OutOfMemoryError: Java heap space。 JVM配置:gc -Xms10M -Xmx10M -Xmn7M -Xss1M -XX:+P...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)