JAVA基础知识|java虚拟机(JVM)
一、JVM简介
java语言是跨平台的,兼容各种操作系统。实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库;jdk=jre+开发工具)。
1.1、JVM体系结构
主要分为:类加载器(ClassLoader)子系统、运行时数据区和执行引擎。
- 类加载器:在JVM启动时或者类在运行时将需要的class加载到JVM中
- 执行引擎:负责执行class文件中的字节码指令,相当于CPU
- 运行时数据区:将内存划分成若干个区,分别完成不同的任务
1.2、JVM生命周期
- 启动:启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的类都可以作为JVM实例运行的起点。
- 运行:main()作为该程序初始线程的起点,任何其他线程均由该线程启动。
- 消亡:当程序中所有非守护线程的都终止时,JVM才退出。Java中的线程分为两种:守护线程 (daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可以把自己的程序设置为守护线程。包含main()方法的初始线程不是守护线程。
一、JVM运行时数据区
1.1、程序计数器
线程私有,生命周期与线程同步。记录代码执行的行数,主要目的是为了处理器在线程切换的时候,能恢复到正确位置继续执行。唯一不会出现OutOfMemoryError的区域。
1.2、虚拟机栈
线程私有,生命周期与线程同步。每个方法执行的时候,都会在栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出入口等。每个方法从调用到完成,就是一个栈帧入栈到出栈的过程。
局部变量表:方法相关的局部变量,包括基本类型(int、float、double、char、bool等)、对象引用(reference)、引用地址(returnAddress )等。
两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈可以动态扩展(当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。
1.3、本地方法栈
线程私有,与虚拟机栈的执行过程基本相同,唯一的区别就是虚拟机栈执行java方法,本地方法栈执行Native方法。当内存空间不足,会抛出OutOfMemoryError 异常。
1.4、方法区
线程共享,存储被虚拟机加载的类信息、常量(final)、静态变量(static)、即时编译后的代码。当内存空间不足,会抛出OutOfMemoryError 异常。
方法区中有一个重要的概念:常量池
常量池:字符串常量池、class常量池和运行时常量池
1.5、堆
线程共享,主要用于存储对象实例,垃圾回收器作用的主要区域。当内存空间不足,会抛出OutOfMemoryError 异常。
关于栈和堆的关系,可以参考《JAVA基础知识|堆和栈》
1.6、直接内存
不是虚拟机运行的一部分,也不是java虚拟机规范中定义的内存区域。当内存空间不足,会抛出OutOfMemoryError 异常。
二、对象访问的两种方式
了解这两种方式,目的是加深理解对象在栈、堆、方法区中的联系。
2.1、句柄访问
虚拟机栈中包含对象的句柄池地址,句柄池中包含对象的实例地址和对象类型地址(方法区中的类信息);
2.2、直接指针访问
虚拟机栈直接指向对象实例和对象类型指针,访问速度更快。
三、实例分析
尝试对具体实例进行分析,有不对的地方,恳请指点。
- package src;
- import java.util.ArrayList;
- //类信息会被存放在方法区
- public class Person {
- private String name;//存放在堆中,因为该类被实例化后存放在堆中,当然也包含它的属性
- private int age;//存放在堆中
- public static String country;//存放在方法区
- public final String world = "地球";//存放在方法区
- //当方法被调用的时候,会创建一个栈帧用于存储方法中的局部变量表,方法出口等信息
- public void getMessge(String name, String age) {
- int a = 0;//存储在虚拟栈
- //arrayList 存放在虚拟栈,new ArrayList<>()存放在堆中
- ArrayList<String> arrayList = new ArrayList<>();
- }
- }
JAVA基础知识|java虚拟机(JVM)的更多相关文章
- [java基础知识]java安装步骤
jre: java运行环境. jre = java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre. jdk: java开发工具集 jd ...
- java基础知识——Java的定义,特点和技术平台
(作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...
- java 基础知识(java web 方面的)
1.java面向对象的基本特征:封装性,多态性,继承性. 2.Java的泛型:iterator接口主要有hasnext()方法,next()方法,remove()方法:collection接口继承了i ...
- [转] Java基础知识——Java语言基础
http://blog.csdn.net/loneswordman/article/details/9905931 http://blog.csdn.net/wanghuan203/article/d ...
- java基础知识精华
转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
随机推荐
- ABAP-会计凭证替代字段GB01设置
1.GB01表字段设置 SM30:VWTYGB01 找到需要替代的字段,设置bexclude勾选为空 2.运行程序 RGUGBR00 激活
- 从零开始搭建vue移动端项目到上线
先来看一波效果图 初始化项目 1.在安装了node.js的前提下,使用以下命令 npm install --g vue-cli 2.在将要构建项目的目录下 vue init webpack mypro ...
- Vue注意事项
在使用Vue中的函数或自己定义的函数或指令的时候,Vue说明如下 在一些自己定义或系统定义的驼峰命名规则的时候,你需要到元素区域引用的使用中间的大写要改成小写在谭家 一条横杠如: 你在var=new ...
- 现在记录几款好用的vscode的插件
vscode 插件 Rainbow Brackets编码过程中,尤其在我们使用js进行函数式编程时,代码里会有很多的花括号,想要保证它们对称十分困难,所以就出现了上面小粉同学的尴尬局面,相信很多人都遇 ...
- Linux 命令之 ln
ln 的作用是制作一个文件或者目录的快捷方式,让我们在使用的过程当中更加方便地使用. 下面我来简单介绍一下 ln 的基本用法. ln 的基本语法 生成一个软链 ln -s source_name li ...
- Python的range和xrange
range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. range示例: >>> r ...
- C++——重载原理分析
C不支持函数重载,C++支持 代码演示 main.c #include<stdio.h> void Max(int a, int b) { printf("%d ", ...
- JS基础篇【1】
该文讲解适用于有一定语言开发基础的朋友们,亦可当作久别重逢之回顾! 1.JS简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记 ...
- 容器自动化(一):docker基础(上)
一,Docker简介,功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上 ...
- 数据库索引碎片——数据库sql
文章:检测和整理索引碎片 文章:[笔记整理]SQL Server 索引碎片 和 重建索引 文章介绍了检查表的索引碎片百分比 文章:[小问题笔记(八)] 常用SQL(读字段名,改字段名,打印影响行数,添 ...