### 概述

我们首先来认识一下`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. memcache常见现象(一)雪崩现象

    memcache常见现象(一)雪崩现象 解释:memcached雪崩现象就是因为缓存服务器出现问题导致数据库压力增大,导致数据库不能正常运行. 1.很多大的公司网站可能会有很多台缓存服务器,这样如果其 ...

  2. python爬虫调用谷歌翻译接口

    2019年7月4日15:53:17 (¦3[▓▓] 晚安 谷歌翻译环境 Python 3.6 第三方库 Execjs (pip install PyExecJS ) 文件列表 同目录下的四个文件: - ...

  3. TCP11种状态集之TIME_WAIT

    先看一个实例,上代码: #!/usr/bin/env python3 # _*_ coding:utf- _*_ import socket sk = socket.socket() sk.bind( ...

  4. Java多线程同步工具类之Semaphore

    Semaphore信号量通常做为控制线程并发个数的工具来使用,它可以用来限制同时并发访问资源的线程个数. 一.Semaphore使用 下面我们通过一个简单的例子来看下Semaphore的具体使用,我们 ...

  5. java基础类型源码解析之HashMap

    终于来到比较复杂的HashMap,由于内部的变量,内部类,方法都比较多,没法像ArrayList那样直接平铺开来说,因此准备从几个具体的角度来切入. 桶结构 HashMap的每个存储位置,又叫做一个桶 ...

  6. 未能加载文件或程序集“Seagull.BarTender.Print, Version=11.0.8.1, Culture=neutral, PublicKeyToken=109ff779a1b4cbc7

    这2天项目上需要使用BarTender打印软件,使用BarTender的库的时候时候发现一个特别的问题: 未能加载文件或程序集“Seagull.BarTender.Print, Version=11. ...

  7. Pandas Series 与 DataFrame 数据创建

    >>> import pandas as pd >>> import numpy as np >>> print(np.__version__), ...

  8. 不要再问我Java程序是怎么执行的了!

    什么是Java虚拟机? 要弄明白Java程序的执行过程首先要了解一下Java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构, ...

  9. CI工具Jenkins的安装配置【linux】——jenkins集成sonarqube-异常解决

    Setup 官网https://jenkins.io/ 下载war包,扔到tomcat下启动即可. 如果有port限制,在iptables中打开商品限制. 访问http://ip:port/jenki ...

  10. JavaScript函数及闭包

    前面一片文章讲到过一点函数,了解到每声明一个函数就会产生一个作用域.而外面的作用域访问不了里面的作用域(把里面的变量和函数隐藏起来),而里面的可以访问到外面的.对于隐藏变量和函数是一个非常有用的技术. ...