JVM(一)
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(一)的更多相关文章
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- JVM类加载
JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...
- Java虚拟机 JVM
finalize();(不建议使用,代价高,不确定性大) 如果你在一个类中覆写了finalize()方法, 那么你可以在第一次被GC的时候,挽救一个你想挽救的对象,让其不被回收,但只能挽救一次. GC ...
- 在 Linux 中安装 Oracle JDK 8 以及 JVM 的类加载机制
参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...
- MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程
在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...
- java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)
尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- JVM虚拟机结构
JVM的主要结构如下图所示,图片引用自舒の随想日记. 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内 ...
随机推荐
- [转载] Linux 下产生和调试core文件
原地址:http://blog.csdn.net/shaovey/article/details/2744487 linux下如何产生core,调试core 在程序不寻常退出时,内核会在当前工作目录下 ...
- 数数(高维DP)
T1 数数 [问题描述] fadbec 很善于数数,⽐如他会数将 a 个红球,b 个黄球,c 个蓝球,d 个绿球排成⼀列,任意相邻不同⾊的数⽬. 现在 R 君不知道 fadbec 数的对不对,想让你也 ...
- P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分
$ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...
- python 常用模块大全
1.getpass 模块 一般用于获取用户输入的密码 import getpass pwd = getpass.getpass('input your pass') print(pwd) print ...
- [原创]Redis 持久化说明及配置
目录 参考链接 介绍 RDB 持久化 优点 缺点 相关配置参数 AOF 持久化 优点 缺点 相关配置参数 参考链接 持久化 Redis命令参考 介绍 Redis 运行时数据保存在内存中, 一旦重启则数 ...
- HTML中title前面小图标和网站收藏现实的图标
网站上的logo实际上是一个“favicon.ico”图片.实现步骤:第一步:制作favicon.ico,大小为16*16毫米:第二步:将“favicon.ico”放到项目的根路径下. 第三步:在所有 ...
- spring测试save方法报错
用test类测试service的save方法时,报错如下: 2018-08-24 21:52:13,506 - could not read a hi value com.mysql.jdbc.exc ...
- 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)
solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...
- Q467 环绕字符串中唯一的子字符串
把字符串 s 看作是"abcdefghijklmnopqrstuvwxyz"的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrst ...
- js 面向对象 定时器 046
获取DOM对象补充 document.getElementsByTagName('div'); //获取的多个DOM对象 这种对象叫伪数组 如果想遍历此对象 通过for(var i=0; i < ...