### 概述

我们首先来认识一下`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. 4.shell编程-文本处理三剑客之sed

    4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...

  2. .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径

    前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...

  3. Linux使用socks代理

    安装一些依赖 yum install epel-release yum install python-pip python-devel gcc gcc-c++ cmake git 安装shadowso ...

  4. Python爬虫的起点

    第一章主要讲解爬虫相关的知识如:http.网页.爬虫法律等,让大家对爬虫有了一个比较完善的了解和一些题外的知识点. 今天这篇文章将是我们第二章的第一篇,我们从今天开始就正式进入实战阶段,后面将会有更多 ...

  5. 使用 Mybatis 框架 jdbc 方式批量写入 SQL Server,报错 com.microsoft.sqlserver.jdbc.SQLServerException 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数,最多应为2100

    这个错是sqlserver抛出来的. 进过验证,上述错误中的2100为插入的总字段数. 比如下面这种插入方式,values后面的一个括号里的字段为30个,那么后面最多只能加70条,即这种批量插入方式一 ...

  6. 记2017青岛ICPC

    2017青岛ICPC 11月4日 早上很早到达了青岛,然后去报道,走了好久的校园,穿的很少冷得瑟瑟发抖.中午教练请吃大餐,吃完饭就去热身赛了. 开幕式的时候,教练作为教练代表讲话,感觉周围的队伍看过来 ...

  7. Codeforces 755D:PolandBall and Polygon(思维+线段树)

    http://codeforces.com/problemset/problem/755/D 题意:给出一个n正多边形,还有k,一开始从1出发,向第 1 + k 个点连一条边,然后以此类推,直到走完 ...

  8. Java设计模式学习笔记(一) 设计模式概述

    前言 大约在一年前学习过一段时间的设计模式,但是当时自己的学习方式比较低效,也没有深刻的去理解.运用所学的知识. 所以现在准备系统的再重新学习一遍,写一个关于设计模式的系列博客. 废话不多说,正文开始 ...

  9. springboot自动装配(2)---实现一个自定义自动装配组件

    对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件 还是这张图 一.创建自己的自动配置工程, spring.f ...

  10. Win10更新后,MySQL服务莫名消失的问题

    手欠的给Win10更新,之后就发现右下角托盘里的小海豚变成白色的了,最后确认MySQL服务丢失 解决办法1: 1.重新安装服务:mysqld --install 2.如果之前没有自定义数据保存路径(d ...