1. JVM的基本结构

1.1. 类加载子系统

类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间。方法区中可能还会存放运行时常量信息,包括字符串与数字常量。(这部分常量信息是Class文件中常量池部分的内存映射)。

1.2. JAVA堆

JAVA的堆在JVM启动的时候建立,几乎所有的Java对象实例都存放于Java堆中。堆空间是所有线程共享的。根据垃圾回收机制的不同,JAVA堆有可能拥有不同的结构。最为常见的一种结构是将整个堆分为新生代和老年代以及持久代。

1. 对象的分配

对象首先分配在eden区,在一次Young GC后,如果对象还存活则会进入S0(from)或者S1(to).之后每次Young GC后如果对象存活,它的年龄就会加1,当对象年龄达到一定条件后,就会被认定为是老年对象,从而进入老年代。

package com.hl.heap;

public class SimleHeap {
public int id; public SimleHeap(int id) {
this.id = id;
} public void show(){
System.out.println("My ID is " + id);
} public static void main(String[] args) {
SimleHeap s1 = new SimleHeap(1);
SimleHeap s2 = new SimleHeap(2);
s1.show();
s2.show();
}
}

SimpleHeap类的信息存放在方法区,主函数中的s1和s2存放在JAVA栈中,并且指向堆中的两个实例。

1.3. 直接内存

JAVA的NIO允许java程序使用直接内存,直接内存是在JAVA堆外的,直接向系统申请的内存空间。通常访问直接内存的速度要优于JAVA堆,直接内存适用于频繁读写的场景,直接内存在JAVA堆外,因此它的大小不会直接受限于Xmx指定的最大堆大小的限制,但是JAVA堆和直接内存依然受限于系统的最大内存。

1.4. 垃圾回收系统

垃圾回收器可对方法区、JAVA堆和直接内存进行回收。

1.5. JAVA栈

每个JVM线程都有一个私有的JAVA栈,JAVA栈在线程创建的时候创建。JAVA栈中保存着局部变量、方法参数、同时和JAVA方法的调用、返回密切相关。

1.5.1 函数调用-出入JAVA栈

栈是线程私有的内存空间,线程执行的基本行为是函数调用,每次函数调用的数据都是通过JAVA栈传递的。JAVA栈是一块先进后出的数据结构,只支持出栈入栈两种操作。在JAVA栈中保存的主要内容为栈帧。每一次函数调用,都会有一个对应的栈帧被压入JAVA栈,每一个函数调用结束,都会有一个栈帧被弹出JAVA栈。JAVA方法有两种返回函数的方式,一种是正常的return,一个是抛出异常,不管哪种方式,都会导致栈被弹出。在一个栈中,至少要包含局部变量表、操作数栈和帧数据区几个部分。JVM提供了-Xss指定线程栈的最大空间,这个参数决定了函数调用的最大深度。

JAVA栈的结构

1.5.1.1 局部变量表

它用于保存函数的参数以及局部变量,局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。由于局部变量表在栈帧中,如果函数的参数与局部变量较多,会使得局部变量表膨胀,从而每一次函数调用就会占用更多的栈空间,最终导致函数的嵌套调用次数减少。

1.5.1.2 操作数栈

主要用于保存计算过程中的中间结果,同时作为计算过程中变量的临时存储空间。操作数栈也是一个先进后出的数据结构,只支持入栈和出栈两种操作。

1.5.1.3 帧数据区

帧数据区中保存着返回常量池的指针,方便程序访问常量池。当函数返回或者出现异常时,虚拟机必须恢复调用者函数的栈帧,并让调用者函数继续执行下去,虚拟机必须有一个异常处理表,方便在发生异常时找到处理异常的代码,因此异常处理表也是帧数据区中重要的一部分。

1.5.1.4 栈上分配

是JVM优化的一项技术,对于哪些线程的私有对象,可以将它们打散分配在栈上,而不是分配在堆上。当函数调用结束后可以自行销毁,不需要GC介入,从而提高系统性能。

1.6. 方法区

和JAVA堆一样,方法区是一块所有线程共享的内存区域。它用于保存系统的类信息,比如类的字段、方法、常量池等,方法区的大小决定了系统可以保存多少个类。在JDK1.7中方法区可以理解为永久区在JDK1.8中永久区被彻底移除,取而代之的是元数据区,元数据区是一块堆外的内存,与持久区不同的是,如果不指定元数据区大小,虚拟机会消耗系统内存,直到耗尽为止。

1.7. 本地方法栈

本地方法栈和java栈非常类似,最大的不同在于java栈用于java方法的调用,而本地方法栈则用于调用本地方法(dll,so)。

1.8. PC(Program Counter)寄存器

也是每个线程私有空间,Java虚拟机会为每个Java线程创建PC寄存器。在任意时刻,一个Java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined。

1.9. 执行引擎

负责执行虚拟机的字节码

©版权声明:本文为【翰林小院】(huhanlin.com)原创文章,转载时请注明出处!

了解java虚拟机---JVM的基本结构(1)的更多相关文章

  1. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  2. Java虚拟机JVM学习03 连接过程:验证、准备、解析

    Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...

  3. Java虚拟机JVM相关知识整理

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  4. 深入理解JAVA虚拟机JVM

    深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...

  5. 深入理解java虚拟机JVM(上)

    深入理解java虚拟机JVM(上) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...

  6. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  7. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  8. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

  9. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

随机推荐

  1. 给Ubuntu18.04安装mac os主题<转载>

     给Ubuntu18.04安装mac os主题 转载来自 https://www.cnblogs.com/feipeng8848(作者) 参考文献 https://linuxhint.com/gnom ...

  2. Windows打开应用,提示“此程序被组策略阻止”

    Windows打开应用,提示"此程序被组策略阻止",该问题为组策略限制了用户使用某个应用程序,一般可以在 1 控制面板--->管理工具--->本地安全策略-->软 ...

  3. 关于axios及其在vue中的配置

    什么是axios?官方解释:axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 具有以下特点: 从浏览器中创建 XMLHttpRequests 从 nod ...

  4. linux定时重启tomcat服务的脚本学习

    要求:在linux中定时重启一个tomcat服务 一:shell脚本即Shell Script [1],Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便 ...

  5. MySQL笔记(1)---MySQL体系结构和存储引擎

    1.前言 本系列记录MYSQL数据库的一些结构和实现特点,方便查询. 2.基本概念 数据库:物理操作系统文件或者其他形式文件类型的集合.MySQL中数据库文件可以是frm.MYD.MYI.ibd结尾的 ...

  6. 【Canal源码分析】TableMetaTSDB

    这是Canal在新版本引入的一个内容,主要是为了解决由于历史的DDL导致表结构与现有表结构不一致,导致的同步失败的问题.采用的是Druid和Fastsql,来记录表结构到DB中,如果需要进行回滚时,得 ...

  7. 深入理解SpringCloud之Eureka注册过程分析

    eureka是一种去中心化的服务治理应用,其显著特点是既可以作为服务端又可以作为服务向自己配置的地址进行注册.那么这篇文章就来探讨一下eureka的注册流程. 一.Eureka的服务端 eureka的 ...

  8. JAVA中 XML与数据库互转 学习笔记三

    要求 必备知识 JAVA基础知识,XML基础知识,数据库的基本操作. 开发环境 MyEclipse10/MySql5.5 资料下载 源码下载   数据库在数据查询,修改,保存,安全等方面与其他数据处理 ...

  9. VS和Eclipse的调试功能哪个更强大?

    以前一直用VS 2012来调试C/C++代码,F5.F10.F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C+ ...

  10. Nginx缓存配置

    访问我的博客 前言 本文介绍利用 nginx 的 nginx_ngx_cache_purge 模块来实现缓存功能,前几篇文章介绍了 Nginx 的动静分离以及 CDN 技术,在其基础上,再对整个页面进 ...