1. Java虚拟机的架构

1.0 运行时数据区:经过编译的class文件,由ClassLoader(类加载子系统)加载后会交给执行引擎执行。在执行引擎执行过程中,会产生一些数据,这些数据被称为运行时数据,存储这些数据的内存区域称为运行时数据区。

1.1 Java的NIO库允许Java程序使用直接内存,访问直接内存的速度优于Java堆。出于性能的考虑,读写频繁的场合会考虑使用直接内存。

1.2 本地方法栈和Java栈非常类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用。

1.3 PC 寄存器: Program Counter寄存器,即:程序计数器,跟随线程的启动而创建。用于记录当前线程重在执行的字节码指令位置。【线程专有】

1.4 在任意时刻,一个Java线程总是在执行一个方法。如果这个方法不是本地方法,PC寄存器就会指向当前正在被执行的指令;如果这个方法是本地方法,PC寄存器的值是undefined。

1.5 JVM内存结构的五大区域:Java栈(虚拟机栈)、本地方法栈、PC寄存器、方法区、Java堆。其中,Java栈、本地方法栈、PC寄存器是线程专有的。

2.Java堆

2.1 结构:根据垃圾回收机制的不同,Java堆可能有不同的结构。最常见的一种结构是将Java堆分为新生代和老年代。

   2.2 流程:

在绝大多数情况下,对象首先会分配到eden区,在一次新生代回收后,如果对象还存活,会进入s0或则s1区;之后,每经历一次新生代回收,如果对象还存活,则年龄加1。年龄达到一定条件后,会被认为是老年对象,进入老年代。

3.Java栈(虚拟机栈)

  虚拟机栈是Java方法执行的内存结构,虚拟机会在每个方法执行时创建一个“栈帧”,用于存储局部变量表,操作数栈等信息。当方法执行完毕后,该栈帧会从虚拟机栈中出栈。

3.1栈帧出入栈【函数调用】过程

3.1.1 出栈顺序:先入后出

3.1.2 每次函数调用的数据都是通过Java栈传递的。

3.1.3 Java栈中保存的主要内容是是栈帧。[栈帧中保存着当前函数的局部变量、操作数、中间运算结果等数据]。

3.2 Java栈基本构架

3.2.1 栈帧至少包含局部变量表、操作数栈和帧数据区。

3.4 当栈空间不足时,函数调用无法继续,系统会抛出StackOverflowError栈溢出错误。【可以通过-Xss设置线程的最大栈空间】

3.5 StackOverflowError演示【递归死循环】

package com.blueStarWei.jvm;

public class StackOverflowError {

    private static int count = 0;

    public static void main(String[] args) {
try{
recursion();
}catch(Throwable e){
System.out.println("deep of calling : "+count);
e.printStackTrace();
}
} public static void recursion(){
count++;
recursion();
}
}

3.5.1 日志输出

//根据-Xss配置的参数不同,被调用的次数会不同
deep of calling : 31661
java.lang.StackOverflowError
at com.blueStarWei.jvm.StackOverflowError.recursion(StackOverflowError.java:18)

4.方法区

4.1 在JDK1.6、1.7中,方法区可以理解为永久区(Permanent).。JDK1.8中,永久区被彻底移除,取而代之的是元数据区(堆外的直接内存)

4.2 方法区是被所有线程共用的内存空间,在JVM启动时创建.

4.3 运行时常量池 : 除了每个类或接口中定义的常量,它还包含了所有对方法和字段的引用。因此当需要一个方法或字段时,JVM通过运行时常量池中的信息从内存空间中来查找其相应的实际地址。

4.4 设置参数

参数 作用 备注
-XX:PremSize 设置永久区初始化空间  
-XX: MaxPremSize 设置永久区的最大空间 默认64MB
-XX:MaxMetaspaceSize 设置元数据区的最大空间 如果不指定大小,虚拟机会耗尽所有可用的系统内存

4.5 垃圾收集在这个区域是比较少出现的,这区域的内存回收目标重要是针对常量池的回收和类型的卸载。

5. 局部变量表

5.1 槽位复用

5.1.1 含义:如果局部变量A超出其作用域,那么在其作用域之后的局部变量B会复用A的槽位。

5.1.2 优点: 节省资源

5.1.3 注意:如果A作用域之后没有新的变量,A不会从局部变量表中移除【可以使用-XX:+PrintGC查看GC信息,判断是否触发GC】

//局部变量a仍然存在于局部变量表中,不会触发GC
public void localGC1(){
{
byte[] a = new byte[**];
}
System.gc();
} //局部变量a的槽位已经被局部变量b复用,触发GC[回收局部变量a]
public void localGC2(){
{
byte[] a = new byte[**];
}
int b = ;
System.gc();
}

6.参考文献

6.1 《实战Java虚拟机 - JVM故障诊断与性能优化》

JVM之基本结构的更多相关文章

  1. JVM的基本结构

    首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数 ...

  2. 巩固java(二)----JVM堆内存结构及垃圾回收机制

    前言:        我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构   ...

  3. 了解java虚拟机---JVM的基本结构(1)

    1. JVM的基本结构 1.1. 类加载子系统 类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间.方法区中可能还会存放运行时常量信息,包括字符串与数字常量.(这部 ...

  4. JVM的内存结构,JVM的回收机制

    内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...

  5. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  6. JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)

    一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...

  7. JVM之内存结构详解

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...

  8. JVM的内存结构以及性能调优

    JVM的内存结构以及性能调优 发布时间: 2017-11-22 阅读数: 16675 JVM的内存结构以及性能调优1:JVM的结构主要包括三部分,堆,栈,非堆内存(方法区,驻留字符串)堆上面存储的是引 ...

  9. JVM的基本结构和JVM的内存结构

    这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...

  10. JVM:内存结构

    JVM:内存结构 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 P ...

随机推荐

  1. swift项目初始化并添加忽略文件Swift.ignore

    1 先去GitHub上去把最新的忽略文件下载下载 https://github.com/github/gitignore 2 然后找到Swift.gitignore  把里面的 pod 前面的# 删除 ...

  2. VUE开发请求本地数据的配置,旧版本dev-server.js,新版本webpack.dev.conf.js

    VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...

  3. Android UiAutomator

    UiAutomator是一个做UI测试的自动化框架.<Android自动化测试框架>中已有详细介绍,这里就不再累赘了. 一.首先了解自动化测试流程 自动化需求分析 测试用例设计 自动化框架 ...

  4. 前端html

    前端html html   是一种描述网页的语言,是超文本标记语言 :hyper Text Markup Lauguage 是一种标记语言[标记语言是一套标记标签 markup tag]使用标记标签来 ...

  5. selenium怎么操作web页面常见的元素

    总结一下selenium怎么操作web页面常见的元素. 主要有: 上传 alter dialog prompt dialog confirm dialog select list radio box ...

  6. vue element-UI 升级报错Cannot find module "element-ui/lib/theme-default/index.css"

    饿了么 用之前的版本 有些组件跟api 不一样了所以更新了最新的版本,发现 报一堆错误 主要错误是这个 Cannot find module "element-ui/lib/theme-de ...

  7. 将本地代码通过git命令上传到github的流程

    首先在项目根目录打开命令行或者直接打开git-bash转到项目根目录下 1.创建本地仓库 $ git init 初始化本地仓库 $ git add --all 将项目文件添加到跟踪列表 $ git c ...

  8. CF919F

    题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...

  9. eclipse的安装及使用

    1.安装 2工作区 3透视图添加透视图 关闭和显示各个子视图 点击视图右上角的关闭按钮可以关闭当前视图 可以选择Window-->Show View菜单项打开各个子视图 4创建项目 选择File ...

  10. jQuery核心方法

    1.$(document.body).css( "background", "black" ); 2.$(myForm.elements).hide():隐藏表 ...