一、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. solr 的edismax与dismax比较与分析

    edismax支持boost函数与score相乘作为,而dismax只能使用bf作用效果是相加,所以在处理多个维度排序时,score其实也应该是其中一个维度 ,用相加的方式处理调整麻烦. 而disma ...

  2. nasm 与 masm语法区别

    看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...

  3. 49. Group Anagrams (string, HashTable)

    Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...

  4. jquery text() html() val()

    test text() 返回 test html() 返回 test val() 没值, val() 适用于有value属性的元素, 例如: input

  5. WebBrowser介绍——Javascript与C++互操作

    WebBrowser控件是Microsoft提供的一个用于网页浏览的客户端控件,WebBrowser控件的使用相当广泛,例如很多邮件客户端都是使用可编辑的WebBrowser控件作为写邮件的工具,也有 ...

  6. Java Thread系列(六)volatile

    Java Thread系列(六)volatile volatile 关键字具备可见性,不具备原子性.主要作用是使变量在多个线程间可见.但不具备原子性(同步性),可以算一个轻量级的 synchroniz ...

  7. java类加载器的一些测试

    package classloader; import java.lang.reflect.Method; import org.junit.Test; import com.example.Samp ...

  8. Oracle学习笔记(七)

    九.高级查询(分组,子查询)查询升级版: 需要用到三张表员工表: desc emp EMPNO 员工号 ENAME 员工姓名 JOB 员工职位 MGR 老板员工号 HIREDATE 员工入职日期 SA ...

  9. [label][JavaScript] 自动填充内容的JavaScript 库

    一个帮助你针对不同标签自动填入内容的轻量级javascript类库 - fixiejs http://www.gbtags.com/technology/javascript/20120802-fix ...

  10. 基于SSH的网上图书商城-JavaWeb项目-有源码

    开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 技术:Java:JSP:JDBC,struts2,spring,hibernate数据库: mysqlweb ...