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. python urllib2 对 http 的 get,put,post,delete

    #GET: #!/usr/bin/env python# -*- coding:utf-8 -*-import urllib2def get():    URL = 'www.baidu.com'   ...

  2. OCP 052题库全变,最新052考试题及答案整理-第11题

    11.Which three are true about UNDO data? A) It is used to roll back failed transactions. B) It is us ...

  3. LoadRunner12_脚本中运行JavaScript

    版权声明:本文为博主原创文章,未经博主允许不得转载. [系统及软件配置] LR版本:12.53 JDK版本:1.8 函数:web_js_run,该函数仅在LR12版本提供支持,LR11不支持JavaS ...

  4. logstash--使用ngxlog收集windows日志

    收集流程 1nxlog => 2logstash => 3elasticsearch 1. nxlog 使用模块 im_file 收集日志文件,开启位置记录功能 2. nxlog 使用模块 ...

  5. 分享VMware题目解答

    VMnet1是主机模式.是一个Host-Only网络模式 192.168.1.254/24VMnet8是NAT模式.是一个NAT方式,最简单的组网方式VMnet6是手动设置的(主机.net.内部) 1 ...

  6. iBatis --> MyBatis

    从 Clinton Begin 到 Google(从 iBatis 到 MyBatis,从 Apache Software Foundation 到 Google Code),Apache 开源代码项 ...

  7. Mac 更改/usr/bin 目录权限失败

    对于Mac OS X 10.11 El Capitan用户,由于系统启用了SIP(System Integrity Protection), 导致root用户也没有权限修改/usr/bin目录.按如下 ...

  8. leetcode-118-Pascal's Triangle(生成具有n行的帕斯卡三角形)

    题目描述: Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. Example ...

  9. JDBC完成增加-修改-增加-查询

    JDBC的基本使用流程: 增加    1 导入jar包:        导入ojdbc6.jar,在项目上右键 builder path-->add to builder path.    2 ...

  10. POJ_2886 Who Gets the Most Candies? 【二分+树状数组】

    一.题目 POJ2886 二.分析 这个题目吧,开始没读懂,做的时候也没懂,WA的时候懂了.假设是第p个出圈的人有一个对应的因子个数$F(p)$,那么,题目求的就是这个$F(p)$最大的对应的人. 1 ...