jvm学习笔记(一)
一、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学习笔记(一)的更多相关文章
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- JVM学习笔记:字节码执行引擎
JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667
- JVM学习笔记(四)------内存调优【转】
转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- python's nonlocal
[python's nonlocal] nonlocal是python3.x中新加的关键字,用于引用本作用域外层作用域的名字 参考:http://blog.csdn.net/chain2012/art ...
- out.println(session.getLastAccessedTime());的返回值到底是毛线意思???
out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, ...
- docker1.9 network跨主机安装
背景:在跨host中,如果docker任何一个重启或者销毁,docker暴露的端口以及ip将可能重新配置,这个时候需要重新记录ip跟端口.在生产环境中往往需要一个固定的ip以及端口去跟容器通信.例如m ...
- war项目部署流程
准备: 1安装jdk1.7及以上版本 2安装tomcat7及以上版本 到%tomcat%/bin目录下记事本编辑server.xml, 配置<Connector>元素port端口,及< ...
- Vue.js基础知识
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml&q ...
- golang语言基础(一)
0.项目的组织结构: GOPATH路径下是src文件夹---->src文件夹下是项目名称---->项目名称下是该项目的各个包名---->各包名下是.go文件(一个包下,无论有多少个. ...
- 动态列 Excel 导出
/// <summary> /// 导出数据通用属性 需在属性进行标记 /// </summary> [AttributeUsage(AttributeTargets.Clas ...
- CentOS 7下面配置静态IP
CentOS 7.0系统是一个很新的版本哦,很多朋友都不知道CentOS 7.0系统是怎么去安装配置的哦,因为centos7.0与以前版本是有很大的改进哦. 说明:截止目前CentOS 7.x最新版本 ...
- VS2010下连接Oracle数据库的方法
在vs2010下使用OleDB连接Oracle数据库 ——此方法不需要配置数据源. 1. 在“服务器资源管理器”中,选择“数据库连接”,右击,选择“添加连接”. 2. 出现下面的界面,并按图中选择“用 ...
- 企业搜索引擎开发之连接器connector(二十三)
我们在前面的文章已经看到,ConnectorCoordinatorImpl类也实现了ChangeHandler接口,本文接下来分析实现该接口的作用 class ConnectorCoordinator ...