Java 环境

Java 运行过程

下面几张图,我们可以了解到 Java 这门语言是如何进行运行的。

java文件通过编译器编译成class文件,然后在虚拟机中转化为机器语言运行在机器上。

上图展示了java 在不同平台的实现。下图则是大意视图。

JDK 和 JRE

  JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件

  JRE:Java Runtime Environment(java运行环境),包含JVM和类库

       JDK:Java  Development Kit(java开发工具包),包含JRE和开发工具包,例如javac、javah

 

从这张图可以看到JDK 可以由 JRE 和 工具类及工具API 组成。而JRE 则是 Java SE API 加上底层的虚拟机。

运行时数据区域

概述

java虚拟机在这行java程序的过程汇总会把它所管理的内存划分为若干个不同的数据区域,各区域各有御用,以及创建和销毁的的时间,下图是虚拟机管理的内存区域。

图一  按功能区域划分,注意了线程共享和隔离的区域

图二   各线程真实地持有各部分的内存空间

图三    JVM栈

我们可以看到线程共享有 堆和方法区,而JVM 栈中包含本地变量数组,操作数栈,常量池引用。

程序计数器(Program Counter Register)

PC Register可以看成是当前线程所执行的字节码的行号指示器,字节码解释器工作时都是通过这个计数器来选择下一条需要执行的字节码指令。同时当线程切换时,程序计数器纪录当前执行的指令,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”内存。
    - 正在执行Native 方法,计数器数值为 0
    - 次内存区域是唯一一个在Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域

虚拟机栈 (JVM Stacks)

线程私有,与线程的生命周期一样,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,存放了编译器可知的各种基本数据类型(boolean ,byte,char,short,int,float,long,double),对象引用(reference 类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址),这个区域规定了两种异常:

  • StackOverFlowError : 栈深度超过允许深度
  • OutOfMemoryError

本地方法栈 (Native Method Stack)

JVM Stack为虚拟机执行 java 方法,而本地方法栈则是为虚拟机所使用到的 Native 方法服务。有些虚拟机将这两个栈合并在一起

java 堆:

java堆是被所有线程共享的一块内存区域,几乎所有的对象实例都在这里分配内存,这区域也是垃圾收集器管理的主要区域,因此很多时候被称作“GC堆”--(GarbageCollected Heap)。从内存回收角度来看,由于现在收集器基本都采用分代收集算法,所以java堆中还可以细分为 : 新生代和老生代。

方法区(Method Area)

方法区和java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。它还有一个别名--“Non-Heap(非堆)”。

运行时常量池(Running Constant Pool)

是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译器生成的各种字面量和符号引用。

直接内存(Direct Memory)

直接内存并不是虚拟机运行时的数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也被频繁使用。特点就是 : 分配在堆外。

上面的图片提到的 DirectByteBuffer 就是直接内存的运用。

参考资料 :

JVM(一)的更多相关文章

  1. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  2. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  3. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  4. JVM类加载

    JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...

  5. Java虚拟机 JVM

    finalize();(不建议使用,代价高,不确定性大) 如果你在一个类中覆写了finalize()方法, 那么你可以在第一次被GC的时候,挽救一个你想挽救的对象,让其不被回收,但只能挽救一次. GC ...

  6. 在 Linux 中安装 Oracle JDK 8 以及 JVM 的类加载机制

    参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...

  7. MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程

    在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...

  8. java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)

    尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...

  9. Jvm --- 常用工具

    jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...

  10. JVM虚拟机结构

    JVM的主要结构如下图所示,图片引用自舒の随想日记. 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内 ...

随机推荐

  1. 不得不说fdm真的好用

    记忆力太差系列 挺好用的软件 下载器FDM真的很好用

  2. 932. Beautiful Array

    For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such ...

  3. css3动画(animation)效果3-正方体合成

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. php面试题汇集2

    1.实现中文字符串截取无乱码方法 开启mbstring扩展,然后自定义函数: <?php header('content-Type:text/html:charset=utf-8'); func ...

  5. ResourceBundle和Locale

    一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的语言          一次处理多个语言环境          ...

  6. JAVA 集合随笔

    JAVA中提供了现成操纵数据的集合,使得我们在开发中基本不用自己动手实现复杂的数据结构,来保存和操纵数据. 所以当我们有了基本的数据结构知识,会合理利用JAVA提供的集合就好啦. JDK1.8;(仅列 ...

  7. 斐讯K2P通过配置文件开启telnet的原理分析

    看过几篇教程之后我已经知道怎么备份固件了.但是现在有一个问题,我的本意是把K2P原机带的固件备份出来,用教程上的方法进行开启telnet.备份固件等操作是否会改变固件呢?下面我们来验证这个问题. Op ...

  8. 实现CTF智能合约题目的环境部署

    本文章是参考一位大佬博客学来的. 智能合约题的环境主要包括两部分:一个是智能合约的部署,另一个就是监听合约事件进而发送flag的脚本. 智能合约部署 这里写的合约是指solidity合约,使用Remi ...

  9. spring测试save方法报错

    用test类测试service的save方法时,报错如下: 2018-08-24 21:52:13,506 - could not read a hi value com.mysql.jdbc.exc ...

  10. BZOJ 2457 双端队列

           Sherry 现在碰到了一个棘手的问题,有N个整数需要排序.        Sherry 手头能用的工具就是若干个双端队列.        她需要依次处理这 N 个数,对于每个数, Sh ...