一、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)的更多相关文章

  1. [java基础知识]java安装步骤

    jre:  java运行环境.  jre =  java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre.    jdk: java开发工具集   jd ...

  2. java基础知识——Java的定义,特点和技术平台

    (作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...

  3. java 基础知识(java web 方面的)

    1.java面向对象的基本特征:封装性,多态性,继承性. 2.Java的泛型:iterator接口主要有hasnext()方法,next()方法,remove()方法:collection接口继承了i ...

  4. [转] Java基础知识——Java语言基础

    http://blog.csdn.net/loneswordman/article/details/9905931 http://blog.csdn.net/wanghuan203/article/d ...

  5. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

  6. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  7. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  8. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  9. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

随机推荐

  1. vscode左侧栏显示

    1.显示工具栏 点击文件,选择首选项,点击设置按钮 搜索workbench,勾选上Workbench> Activity Bar:Visble 勾选上后,工具栏就显示出来了 2.移动工具栏选中工 ...

  2. 【leetcode】544. Output Contest Matches

    原题 During the NBA playoffs, we always arrange the rather strong team to play with the rather weak te ...

  3. SQL SERVER-孤立用户

    --SQL SERVER用户管理分为两层,实例级的login和数据库级的用户 --login的SID和数据库用户的SID必须一样才行 --数据库搬迁login在重建时生成新的sid,与原来数据库的用户 ...

  4. windows cmd命令学习

    tasklist|findstr "py"

  5. 最近都会来学一点Python

    https://www.cnblogs.com/hellosecretgarden/p/9206648.html 打开电脑,发现Python都是之前的代码,将近一年之前的时间. 最近都会重新掌握起来, ...

  6. 某公司git代码管理,到如何上线

  7. LPCXpresso54608开发板中文用户手册

    M11035 LPCXpresso54608/54618/54S618开发板用户手册 1.        简介 LPCXpresso系列电路板为恩智浦LPC Cortex-M系列微控制器提供了强大而灵 ...

  8. 运输层7——TCP的流量控制和拥塞控制

    目录 1. TCP的流量控制 2. TCP的拥塞控制 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控 ...

  9. subprocess模块笔记

    subprocess笔记 import subprocess subprocess.call("netstat -ano") #父进程等待子进程完成任务,返回执行结果和结束信息0或 ...

  10. P2P system:How Chord tackles failures

    若有peer failures 怎么办 接上面的例子,如果N32 fail掉了,但是N80的finger table还没有更新,这样query到了N16,它找不到N32,只有N80,这样query就会 ...