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 在程序不寻常退出时,内核会在当前工作目录下 ...
- Android中Application类的使用
在最近的Android项目中,有些代码需要从程序的运行周期开始一直到运行周期结束:比如说本地数据库的初始化,从服务器获取数据等:可以说Application对象的生命周期是整个程序中最长的,它的生命周 ...
- [AIR] 使用操作系统默认应用程序打开文件
AIR 2.0及以上提供了非常简单易用的API让你使用操作系统所定义的关联应用程序打开文件. 这使得使用AIR开发基于“文件管理器”的应用称为可能 用法如下: var file:File = File ...
- jquery源码解析:pushStack,end,ready,eq详解
上一篇主要讲解了jQuery原型中最重要的方法init.接下来再讲一些比较常用的原型方法和属性 core_slice = [].slice, jQuery.fn = jQuery.prototype ...
- 大数据list去重
MaxList模块主要是对Java集合大数据去重的相关介绍. 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去去重. 直 ...
- svn提交新文件夹同时不需要更新全部上级目录
关于svn的指定目录指定位置更新:当在提交了新建的目录后可以使用 a) 在需要更新的上级目录上单击右键 在延伸菜单中选择 b) 弹出对话框中选择,check repository c) 新添加的 ...
- Chrome插件下载和安装方法
http://jingyan.baidu.com/article/e4511cf35c2df92b845eafb3.html 扩展程序的下载方法 1 每个 Chrome 扩展程序 都有一个固定的 ...
- P5108 仰望半月的夜空
题目链接 题意分析 给你一个字符串 让你求\(1-n\)长度下的字符串的中字典序最小并且最靠左的字符串的开头位置 我们考虑先建出\(SA\) 然后考虑对于一个字符串后缀排序之后 baba 后缀排序之后 ...
- Tomcat中查看JVM内存使用情况
TOMCAT运行时,实时监控当前应用JVM的使用情况:可以利用Tomcat自带的应用manager查看详情. 首先,确认服务目录webapps下有manager应用 其次,需要创建角色manager和 ...
- lvm拉伸与快照
一.拉伸 *用fdisk分区 *构建pv *将pv加入vg *将pv内的pe加入lv *通过resize将文件系统的容量增加 1.分区 [root@server3 ~]# fdisk /dev/vdb ...