### 概述

我们首先来认识一下`JVM`的运行时数据区域,如果说`JVM`是一个人,那么运行时数据区域就是这个人的骨架,它支撑着JVM的运行,所以我们先来学习一下运行时数据区域的分类和简单介绍。

### 分类

从所在区域角度上来说,可以分为内部内存和外部内存,其中内部的内存又包括了线程独占区和线程共享区。

![](http://puiy2tvnj.bkt.clouddn.com/2019-08-03-035132.png)

在JVM内部,从线程共享角度上来说,又可以分为线程独占区和线程共享区。

线程独享区可以中包含以下三种数据区域:

- 程序计数器(Program Counter Register)

- 虚拟机栈(VM Stack)

- 本地方法栈(Native Method Stack)

线程共享区中包含以下两种数据区域:

- 方法区(Method Area)
- 堆(Heap)

在JVM外部也就是**本地内存**中,包含了**直接内存**和**元数据(Metadata)**,在JDK 1.8中,元数据就是我们之前的永久代(持久代)

他们之间的区别是,JDK 7在持久代中的常量池在JDK 8移到了堆内存中,剩余部分移到了元数据中。

![](http://puiy2tvnj.bkt.clouddn.com/2019-08-03-052009.png)

### 多线程的实现原理

上面我们把运行时的数据区域分为了线程独占区和线程共享区,那么Java中的多线程是怎么实现的呢?这可以帮助我们对于线程独占区和共享区有更深的理解。

在多个线程运行的时候,其实是把CPU的使用时间分割成了无数个小份,然后根据优先级去给这些线程分配时间,CPU在这些小时间块中快速切换,给用户的感受就是多线程同时在运行,如下图:

![image-20190803142000793](http://puiy2tvnj.bkt.clouddn.com/2019-08-03-062005.png)

通过这个图,我们可以清晰的看出是如何达到多线程的效果(其实在通信的时候也有同样的原理——时分多路复用)

其实通俗一点来说,线程的独占区主要是为了**控制方法的正常运行**,而线程的共享区更类似于一个**存储信息的仓库**。

打个简单的比方,现在有一个方法,我们使用两个线程同时去调用这个方法,属于该方法的信息就可以称之为独占区,而类中的变量,对象却可以被两个方法**同时使用**。

### 两种异常

在和JVM打交道的过程中,我们经常会遇到两种错误:`StackOverflowError`和`OutOfMemoryError`,

`StackOverflowError`异常出现在线程独占区的本地方法栈和虚拟机栈中,而`OutOfMemoryError`会出现在除程序计数器外的所有区域。

![image-20190803144254116](http://puiy2tvnj.bkt.clouddn.com/2019-08-03-064309.png)

> 原创文章,才疏学浅,如有不对之处,万望告知!

JVM(二):画骨的更多相关文章

  1. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  2. 深入理解JVM(二)Java内存区域

    2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...

  3. 一步步优化JVM二:JVM部署模型和JVM Runtime

    选择JVM部署模型    JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就 ...

  4. JVM(二) 对象存活判断和垃圾回收算法

    对象的创建 概述 下面简要介绍创建对象的几个重要步骤 : 检查能否在常量池定位到一个类的符号引用,并检查这个符号代表的类是否已被加载,解析和初始化过.如果没有则执行类加载的操作.(即是说对象的引用放在 ...

  5. JVM(二) 栈内存结构

    栈内存是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表.操作数栈.动态链接.返回出口等信息.每一个方法从调用直至执行完成的过程,就对应 ...

  6. 深入理解JVM(二)--垃圾收集算法

    一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Li ...

  7. JVM(二)-内存区域之线程私有区

    概述: 对于从事C.C++开发的程序员来说,在内存管理领域,他们既是拥有最高权力的"皇帝",又是从事最基础工作的劳动人民--既拥有每个对象的"所有权", 又担负 ...

  8. 垃圾收集器与内存分配策略 (深入理解JVM二)

    1.概述 垃圾收集(Garbage Collection,GC). 当需要排查各种内存溢出.内存泄露问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调 ...

  9. 深入理解JVM(二)--对象的创建

    Java是一门面向对象的语言,在Java程序运行的过程中,无时无刻都会有对象被创建出来,在程序语言中,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字,但是在虚拟机中是怎样的呢?本文主要了解一 ...

随机推荐

  1. .NET Core IdentityServer4实战 第Ⅴ章-单点登录

    OiDc可以说是OAuth的改造版,在最初的OAuth中,我们需要先请求一下认证服务器获取下Access_token,然后根据Access_token去Get资源服务器, 况且OAuth1 和 2 完 ...

  2. mysql的union和or

    实践出真知! 使用union连接 select `id` from `表名` where 0=0 and active=1 and `fullname` like '王%' union select ...

  3. 第一个SpringBoot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我 ...

  4. JAVA UUID 生成唯一密钥(可随机选择长度)

    /**     * 获得指定数目的UUID      * @param number int 需要获得的UUID数量      * @return String[] UUID数组      */    ...

  5. extern和static区别

    1. 声明和定义 ​ 当定义一个变量的时候,就包含了对该变量声明的过程,同时在内存张申请了一块内存空间.如果在多个文件中使用相同的变量,为了避免重复定义,就必须将声明和定义分离开来.定义是创建与名字关 ...

  6. Windows下必备的开发神器之Cmder使用说明

    诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...

  7. redis快速部署

    1. 场景描述 以前是直接使用公司提供的redis集群,只使用不负责维护,因项目用到负载均衡,需要使用redis做session共享,存储session信息,所以就部署了下,记录下以便后续能快速部署. ...

  8. Spring Boot日志使用

    前言: 这是我第一次仔细研究Spring Boot相关的知识,就拿日志下手了,欢迎大家指点 Spring Boot日志关系 这个是Spring Boot的启动器,我们点击spring-boot-sta ...

  9. word 2010 页眉 http://jingyan.baidu.com/article/a65957f4b0208624e77f9b55.html

    word 2010 页眉 http://jingyan.baidu.com/article/a65957f4b0208624e77f9b55.html

  10. 反⑨baka拖更大队:临时约法

    本团队中将不时发起团队讨论报道⑨baka无良~ 某无良⑨baka一直拖更引起广大人民群众不满 文文新闻:https://www.luogu.org/discuss/show/52654 反⑨baka的 ...