一、java的运行原理

  • 开发人员编写java代码(.java文件)
  • 编译器将.java文件编译成字节码文件(.class文件)
  • 字节码被装入内存,当字节码被装入内存之后,它就会被解释器解释执行或是被即时编译器有选择的转换成机器码执行

二、jvm体系结构

1、类装载(classLoader)子系统

    根据给定的全限定名类名来装在.class文件的内容到Runtime Data Area中的method Area(方法区域)。

2、执行引擎(Execution Engine)子系统

    执行引擎也叫做解释器(Interpreter),负责解释命令提交给操作系统执行。

3、本地接口(Native Interface)组件

      本地接口的作用是融合不同的编程语言为JAVA所用,目前该方法使用的比较少,因为现在的异构领域间的通信很发达,比如socket、webservice等

4、运行数据域(RuntimeDataArea)组件

      运行数据区是整个 JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行

4.1 Java Stack(栈)

        栈是在线程创建的时候创建的,它的生命周期是跟随线程的生命周期的,线程结束栈内存就被释放了,所以栈不存在垃圾回收问题。栈主要用于存放引用和基本数据类型(八大基本数据类型)。当一个线程把栈内存用光了之后(一般是递归函数造成的)

      就会产生StackOverflowError异常。如果虚拟机栈内存可动态扩展(目前大部分的java虚拟机都可动态扩展),如果扩展时不能申请到足够的内存地址时就会产生oom异常

      栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法 A 被调用时就产生了一个栈帧 F1,并被压入到栈中,A 方法又调用了 B 方法,于是产生栈帧 F2 也被压入栈,执行完毕后,先弹出 F2 栈帧,再弹出 F1 栈帧,遵循“先进后出”原则。

      栈帧中保存的数据类型:

      • 本地变量(Local Variables),包括输入参数和输出参数以及方法内的变量;
      • 栈操作(Operand Stack),记录出栈、入栈的操作;
      • 栈帧数据(Frame Data),包括类文件、方法等等。

图示在一个栈中有两个栈帧,栈帧 2 是最先被调用的方法,先入栈,然后方法 2 又调用
了方法 1,栈帧 1 处于栈顶的位置,栈帧 2 处于栈底,执行完毕后,依次弹出栈帧 1 和栈帧
2,线程结束,栈释放

    4.2 Java heap(堆)

        堆内存是跟随jvm的,此部分是所有线程共享的,一个jvm只有一个堆内存,但是堆内存的大小是可以调节的。堆主要用于存贮new出来的对象实例以及实例变量以及数组。当新创建

      的对象申请的内存大于当前堆内存中的空闲空间时就会出现oom(Out of Memory)异常.堆是垃圾收集器管理的主要区域,所以有时候也被称为“GC堆”

      堆内存组成:

        

         

    • Young Generation Space 新生区

新生区

(Young Generation Space)

伊甸区(Eden Sapce)

所有的类都是在该区域内new出来的,当该区域内空间用完而jvm又需要创建新的对象时,jvm对该区进行垃圾回收,将不再被其他对象引用的对象销毁,并且将剩余的对象移到幸存0区。加入0区空间也满了,jvm就会堆0区进行垃圾回收。并将对象移到1区,如果1区也满了同样会对1区进行来及回收,并将对象移到养老区

幸存0区(Survivor 0 Space)

主要保存从伊甸区筛选出来的对象

幸存1区(Survivor 1 Space)

主要保存从伊甸区筛选出来的对象

      • Tenure generation space 养老区

      养老区用于保存从新生区筛选出来的 JAVA 对象,一般池对象都在这个区域活跃。

      • Permanent Space 永久存储区

永久存储区是一个常驻内存区域,用于存放 JDK 自身所携带的 Class,Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不
会被垃圾回收器回收掉的,关闭 JVM 才会释放此区域所占用的内存。此外,该区域还会保存一些常量,这些常量可以是编译期已克制的常量,也可以是运行期生成的常量(例如

  String.intern()方法)

4.3 Method Area(方法区) 

方法区是被所有线程共享,用于存贮已被虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码等数据。此部分还包含运行时常量池(Runtime Constant Pool),运行时常量池

保存的时编译器生成的各种变量和符号引用。

4.4 PC Register(程序计数器)

  程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行

的字节码指令。如果线程执行的时一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,那么这个计数器的值则为空(Undefined)。此内存区域是唯一一个在java虚拟机规范中没有规定任何oom(Out Of Memory)情况的区域

4.5 Native Method Stack(本地方法栈)

本地方法栈是为虚拟机使用到的native方法服务,它的实现的语言、方法与结构并没有强制性的规定。这个区域会抛出 StackOverflowError 和 OutOfMemoryError 异常。

 

jvm学习笔记(一)的更多相关文章

  1. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  2. JVM学习笔记:字节码执行引擎

    JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667  

  3. JVM学习笔记(四)------内存调优【转】

    转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...

  4. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  5. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  6. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  7. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  8. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  9. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  10. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

随机推荐

  1. 每月IT摘录201807

    一.技术 1.专注于一个领域,横向扩展其他领域的技术.2.想得太多,做得太少. 3.想要成为一名web开发高手.必须熟悉以下内容: a.每次请求和响应的背后究竟发生了哪些步骤?客户端和服务器是如何通过 ...

  2. 4-在windon10上mysql安装与图形化管理

    安装及可能遇到的问题: 1.windows10上安装mysql(详细步骤  https://blog.csdn.net/zhouzezhou/article/details/52446608 2. 在 ...

  3. MVC架构思想

  4. 4款APP原型设计工具助你搞定移动应用设计!

    随着信息化社会的不断发展,不仅手机迭代更新的速度飞快,就连手机里的App 也层出不穷.作为一名UI/UX设计师或产品经理,如何才能设计一款出色的移动App?光有好的创意是不够的,你还需要一款正确的Ap ...

  5. FW:程序在内存的划分(转)

    一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...

  6. IntelliJ IDEA 2017版 spring-boot-devtools实现热部署

    1.配置pom.xml文档 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  7. swipe.js 使用方法

    1.插件要求的css样式: <style> .swipe { overflow: hidden; visibility: hidden; position: relative; } .sw ...

  8. linux下的文本操作之 文本查找——grep

    摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...

  9. LoadRunner监控SQLServer

    监控SQLSERVER时,能增加度量.但是只有系统资源相关的度量有数据,而和sqlserver相关的度量却没有数据. 解决方法: 改为在System Resource Graphs中通过添加Windo ...

  10. 使用python读写excel

    项目中要在excel要跨工作簿根据一列数据获取另一列的数据,而excel本身的函数vlookup一直不太好用,只能用程序进行处理了,最近刚接触了python,灵机一动使用Python进行处理,先将js ...