一、JVM启动流程

  1. 通过java +xxx(或javaw)启动java虚拟机
  2. 装载配置,会在当前路径中寻找jvm的config配置文件。
  3. 根据查找jvm.dll文件。这个文件就是java虚拟机的主要实现。
  4. 使用这个dll,初始化jvm虚拟机。获得相关的接口。
  5. 找到main方法开始运行。

上面这个过程的描述虽然比较简单,但是jvm的启动流程基本都已经涵盖在里面了。

二、jvm的基本结构

类加载器子系统就是通常我们所说的ClassLoader类加载器,首先我们会通过ClassLoader加载到jvm的内存中去,本地方法区主要就是native的方法调用

pc寄存器

  • pc寄存器是线程私有的,在线程创建时创建。
  • 执行非native方法时,pc寄存器的值是当前需要执行指令的地址;执行native方法时,pc寄存器的值是undefined。
  • pc寄存器不会发生内存溢出,因为其存储的数据和所占空间大小不会随程序的执行而发生改变。

方法区

  • 线程共享
  • 保存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 在JVM规范中,没有强制要求方法区必须实现垃圾回收。很多人习惯将方法区称为“永久代”,是因为HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器可以像管理堆区一样管理这部分区域,从而不需要专门为这部分设计垃圾回收机制。不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。

java堆

  • 所有线程都共享java堆
  • 存储new出来的对象,以及数据(引用存放在Java栈中)
  • 垃圾回收器管理的主要区域

java栈

  • 线程私有
  • 栈是由一系列栈帧组成,每个栈帧对应一个被调用的方法。栈帧中保存一个方法的局部变量表、操作数栈、执行运行时常量池的引用和一些额外的附加信息。
  • 每一次方法调用都会创建一个新的栈帧,并压栈;当方法执行完毕之后,便会将栈帧出栈。由此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部,以及使用递归方法的时候容易导致栈内存溢出的现象。
  • 栈上分配:对于小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上(直接分配在栈上,可以自动回收,减轻GC压力);大对象或者逃逸对象无法栈上分配

栈帧中数据的说明:

局部变量表:

  • 存储方法中的局部变量(包括方法中的非静态变量以及函数形参)
  • 对于基本数据类型的变量,直接存储它的值;对于引用类型的变量,则存储对象的地址。
  • 局部变量表的大小在编译时就确定了,因此在程序执行期间其大小是不会改变的。

操作数栈:

  • 程序中的所有计算过程都是在借助于操作数栈来完成的。
  • 栈最典型的一个应用就是用来对表达式求值。

指向运行时常量池的引用:

  指向在方法执行的过程中使用的常量。
方法返回地址:

  当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。

三、内存模型

 
下图为多个线程执行的过程:

Java虚拟机(一):JVM的运行机制的更多相关文章

  1. 【转】Java虚拟机的JVM垃圾回收机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp43       1.JVM内存空间     JVM堆(Heap)= 新生代 ...

  2. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  3. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  4. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  5. 深入理解Java虚拟机(自动内存管理机制)

    文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...

  6. Java虚拟机(JVM)中的内存设置详解

    在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation ...

  7. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  8. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  9. Java虚拟机(JVM),JDK,JRE和JVM的区别——通过示例学习Java编程(2)

    Java虚拟机(JVM),JDK,JRE和JVM的区别 作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid ...

  10. [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结

    Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...

随机推荐

  1. Unity的Update() 和 FixedUpdate()的区别

    Update() 和 FixedUpdate()在游戏中都会在更新的时候自动循环调用. 但是Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关以及被渲染的物体 ...

  2. bzoj 3173 最长上升子序列

    Written with StackEdit. Description 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字, ...

  3. LibreOJ β Round #2 题解

    LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...

  4. 如何在本地浏览器访问nginx

    1.打开vmware"编辑虚拟机"设置,点击“网络适配器”选择“桥联模式”: 2.开启该虚拟机,输入用户名root及密码登陆服务器: 3.以管理员身份打开cmd,在命令窗口输入ip ...

  5. 序列化 SqlAlchemy 的结果为 json 字符串

    http://my.oschina.net/gongshang/blog/395431?p=1 在设计 RESTful 的网站时,我们总是希望 ORM 框架返回的结果是可以直接给 View 层使用的 ...

  6. egg 使用手记(一)

    1. 文件加载规则 引用官方的说法: 框架在加载文件时会进行转换,因为文件命名风格和 API 风格存在差异.我们推荐文件使用下划线,而 API 使用驼峰.比如 app/service/user_inf ...

  7. find 使用指南

    find 使用方法整理 -name  按照文件名查找文件. -perm  按照文件权限来查找文件. -user  按照文件属主来查找文件. -group  按照文件所属的组来查找文件. - n表示文件 ...

  8. Winform判断是否已启动

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  9. 在Activity中使用Menu

    1.右击res-->New-->Directory输入文件名menu,在此文件夹下新建main菜单文件:右击menu-->New-->Menu resource file 2. ...

  10. php创建token

    token是唯一的标识,随机字符串+时间戳结合,一般不会出现重复的字符串了. 这是一种方式 function create_token() { $randLength = 6; $chars = 'a ...