Java虚拟机的内存管理主要分两点:内存分配以及内存回收。·

一、内存分配图:

注: 所占区域的大小与实际的内存大小比例并无直接关系。

解读:

1、如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问。

2、程序计数器:

用途:用来给程序导航指路的。这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器。理解就是虚拟机把java源代码编译成了字节码,然后程序被执行,但是程序执行是需要顺序的,什么时候该执行什么代码呢?就是靠这个程序计数器来实现的,字节码解释器在工作的时候会改变这个计数器的值,来选取下一条需要执行的字节码指令。

特点:

(1)、每个线程一个。大家知道,所谓的多线程事实上是把时间进行切片然后把细碎的时间无序的分配给多个线程使用,cpu在多个线程之间切换,看起来就像是多个线程同时执行。在频繁的线程切换中药保证每一个线程在被执行的时候都能够正确的执行下一行代码,就需要给每一个线程分配一个独立的程序计数器。所以程序计数器是在蓝色区域,是每一个线程都独立拥有的,数据线程隔离。

(2)、因为是记录一个虚拟机字节码指令地址的,所以不会有内存溢出。

注意:如果线程执行的是一个java方法,这个计数器记录的是正在执行的续集字节码的指令地址,而如果正在执行的是一个Native方法,则计数器为空。
    Native方法:如果翻译的话是翻译成“本地方法”。理解的话就是一个java接口,但是它的实现不是使用java语言。详细一点的介绍一篇博客:                                http://blog.csdn.net/wike163/article/details/6635321。

3、Java虚拟机栈:

用途:描述方法执行的内存模型,在该线程上,每一个方法执行都会创建一个栈帧(一方法一栈帧),每一个方法的调用到执行完成的过程就是一个栈帧在虚拟机中的入栈到出栈的过程。

特点:

(1)、Java虚拟机栈是线程私有的;

(2)、每一个方法对应的栈帧主要用来存储每一个方法的局部变量表、操作数栈、动态链接、方法出口等信息(具体后面讨论);

(3)、在一般意义理解上的内存管理分为栈和堆,其中的栈指的是虚拟机栈中的栈帧中的局部变量表;

(4)、异常:

Stack Overflow异常:当请求的栈深度大于虚拟机所允许的栈深度出现;

OutOfMemoryError异常:当栈进行动态扩展,无法申请到足够的内存时出现;

(5)、栈帧的局部变量表需要的内存空间在编译期间完成分配,而当方法运行的时候是不会发生改变的,这个和类一样,类的对象需要的内存空间在类加载的时候就已经确定,分配对象内存的时候不会发生改变。

4、本地方法栈:

用途:与java虚拟机栈类似,都是用来执行方法,区别是java虚拟机栈执行的是java方法,而本地方法栈执行的是Native方法。

特点:不是每一种java虚拟机都有本地方法栈,一些虚拟机中将它与java虚拟机合二为一。

5、Java堆:

用途:存放类实例对象和数组;

特点:

(1)、所有运行时数据区最大的一块,GC(垃圾收集管理器)的主场;

(2)、OutOfMemoryError异常:当堆中没有内存可以用来完成类实例的分配了,而且也没有办法再扩展大小的时候会出现OutOfMemoryError异常;

(3)、是所有线程共享的区域;

5、方法区(Method Area):

用途:用于存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。(java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它是与堆不一样的)

特点:

(1)、这个区域的垃圾回收是很有必要的,虽然效率上是很低的。垃圾收集的对象主要是常量池的回收以及对类型的卸载。

(2)、异常:当方法区无法满足内存分配需求的时候将出现OutOfMemoryError异常。

(3)、这个区域也是所有线程共享的。

6、运行时常量池:

用途:一个类在编译的时候会生成各种字面量和符号引用,这部分内容在类加载时将会进入方法区的运行时常量池进行存放。

特点:

(1)、它是方法区的一部分(JDK1.6之后常量池被放入堆空间中);

(2)、具备动态性;上面说的运行时常量池是存放在类加载的时候产生的常量,但是在运行的时候其实也可以把新的常量放入池中,如String 的intern方法;这个方法会把字符串放入运行时常量池中,并返回该字符串,作用是重用字符串,即当调用这个方法的时候会去运行池常量中检查是否已经存在相同的字符串,若是,则指向该字符串,若不是,则把该字符串放入运行时常量池中并返回该字符串。

(3)、异常:当常量池无法申请到内存时会抛出OutOfMemoryError异常。

Java虚拟机一 运行时数据区(栈、堆、方法区等)的更多相关文章

  1. 深入理解Java虚拟机(一) 运行时数据区划分

    前言:从我学Java的第一天开始,我的大学老师就告诉我 Java语言相比C.C++的语言有一个非常强大的功能,那就是自动内存管理:我们用Java编码时不需要申请或释放内存等,这些工作全部交由我们的Ja ...

  2. Java虚拟机及运行时数据区

    1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...

  3. Java虚拟机_运行时数据区

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

  4. 【Java虚拟机】运行时数据区

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  5. java虚拟机规范-运行时数据区

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机 ...

  6. 深入理解Java虚拟机-JVM运行时数据区域

    一.运行时数据区域 1.程序计数器 程序计数器( Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. Java虚拟机的多线程是 ...

  7. java虚拟机规范-运行时栈帧

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 java虚拟机规范-运行时数据区 java内存运行时的栈帧结构 java ...

  8. 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问

    转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...

  9. 【转载】深入理解Java虚拟机笔记---运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

随机推荐

  1. Redis(REmote DIctionary Server)基础

    Redis(REmote DIctionary Server)基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Redis是一个开放源代码(BSD许可)的内存数据结构存储,用作数 ...

  2. springmvc 项目单元测试

    对于web项目如果希望通过url来进行单元测试,但是启动服务器和建立http client 来进行测试非常麻烦,并且依赖网络环境.这样我们可以通过引入MockMvc进行测试. 一.引入jar包 < ...

  3. CMDB服务器管理系统【s5day89】:深入理解Java的接口和抽象类

    对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...

  4. httpClient4.5 closeableHttpClient用法

    HttpClient一 简介1.尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能.HttpClient就是寻求弥补这项空白的组件,通过提 ...

  5. django中的一对一、一对多、多对多及ForeignKey()

    参考文章: Django ORM.一对一.一对多.多对多.详解 刘江的博客——关系类型字段 问题: OneToOneField()与ForeignKey()的区别及其使用场景

  6. Codeforces Round #545 (Div. 2) C. Skyscrapers 离散化+贪心

    题目链接 给你一个n∗m的矩阵res,让你输出一个n∗m的矩阵a,这个矩阵满足:给你一个n*m的矩阵res,让你输出一个n*m的矩阵a,这个矩阵满足:给你一个n∗m的矩阵res,让你输出一个n∗m的矩 ...

  7. dubbo和zikkeper的使用

    1.先来一段异常看看:No provider available for the service 16:05:25.755 [localhost-startStop-1] WARN o.s.w.c.s ...

  8. iTOP-4412开发板_驱动_adc驱动升级和测试例程

    本文档介绍 iTOP-4412 开发板的 adc 驱动的升级和测试例程.自带的驱动只能支持一路 adc,本文介绍如何修改可以支持 4 路 adc 的控制.1 硬件简介如下图所示,这是 4412 的 d ...

  9. JavaWeb - apache和tomcat是如何配合工作的

    ref: https://jingyan.baidu.com/article/47a29f246f354ec0142399dc.html 网上有很多的介绍apache和tomcat的区别,但大部分都是 ...

  10. [ZJOI2008]树的统计-树链剖分

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; #define mid ((l+r)>> ...