一、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、直接指针访问

虚拟机栈直接指向对象实例和对象类型指针,访问速度更快。

三、实例分析

尝试对具体实例进行分析,有不对的地方,恳请指点。

packagesrc;importjava.util.ArrayList;

//类信息会被存放在方法区

public classPerson {private String name;//存放在堆中,因为该类被实例化后存放在堆中,当然也包含它的属性

private int age;//存放在堆中

public static String country;//存放在方法区

public final String world = "地球";//存放在方法区//当方法被调用的时候,会创建一个栈帧用于存储方法中的局部变量表,方法出口等信息

public voidgetMessge(String name, String age) {int a = 0;//存储在虚拟栈//arrayList 存放在虚拟栈,new ArrayList<>()存放在堆中

ArrayList arrayList = new ArrayList<>();

}

}

转载于:https://www..com/maikucha/p/9103348.html

Java基础看jvm,JAVA基础知识|java虚拟机(JVM)相关推荐

  1. java怎么看内存值_【java】内存分析

    在J2SE中,通过进行内存分析,可以让我们更好的理解我们的程序在内存中是怎么被分配内存的.也能让我们更好的理解我们的代码是怎么运行的. 对于我自己来说分析内存也是一件很有趣的事情.所以下面通过一个例子 ...

  2. day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格

    1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...

  3. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  4. Java基础看这篇就足够用了(基础知识汇总)

    文章目录 第一章.java环境搭建 1.1.Java介绍 1.1.1. Java开发平台 1.1.2. Java开发环境搭建 1.1.3 .Java专业术语 1.1.4. 第一个Java程序 1.1. ...

  5. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java基础看这一篇就够了

    一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. J ...

  7. day01计算机基础知识Java语言基础

    计算机基础知识(计算机概述) 计算机基础知识(软件开发和计算机语言概述) 计算机基础知识(人机交互) 计算机基础知识(键盘功能键和快捷键) 计算机基础知识(如何打开DOS控制台) 计算机基础知识(常见 ...

  8. JVM 并发性: Java 和 Scala 并发性基础(1)

    转载于:http://www.itxuexiwang.com/a/javajishu/jvm_jdk_yuanmafenxi/2016/0129/50.html?1454076380 处理器速度数十年 ...

  9. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

最新文章

  1. 产品经理必须知道的概念-什么是前景效应分析?用户决策背后的影响因子有哪些?
  2. python对文件中的关键词查找替换,实现自动获取配置
  3. brave浏览器_Brave浏览器基础使用教程,同时如何通过Brave获取BAT奖励
  4. win10大文件无法移动到U盘
  5. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理
  6. PowerDesigner-快速入门(极简教程)
  7. IT管理者年终总结 | 2021年,IT管理者必须领悟到的7个要点
  8. Unable to load native-hadoop library的解决方法
  9. DataGrid的动态绑定问题(二)
  10. mt65xx android phone win10驱动,mt65xx android phone驱动
  11. 2021新版OPEN易支付免费开源版 亲测可用
  12. 锐龙r7 4800U和i7-10710U 哪个好
  13. AndroidStudio:The application‘s minSdkVersion is newer than the device API level.
  14. C++ 简单编程——两数相乘
  15. 说说java中extends与implements的区别
  16. css实现精灵图片加载图片失败
  17. NET Framework合集
  18. 彻底搞懂计算机计算补码,就像接近宇宙的真理
  19. 16.CSS中使用颜色
  20. Flink 全网最全资源(视频、博客、PPT、入门、原理、实战、性能调优、源码解析、问答等持续更新)

热门文章

  1. 《京东峰值系统设计》读后感
  2. 小程序无限层级路由方案
  3. 《Python基础教程第二版》第二章-Python列表和元祖
  4. 为什么Bugs没有被修复?
  5. RabbitMQ OS X下安装及常用命令-1
  6. 对tomcat服务的***演示与安全分析
  7. POJ 2356 Find a multiple (抽屉原理)
  8. 阻碍GIS产业发展的三大问题
  9. 基于Spring Boot + Dubbo的全链路日志追踪(一)
  10. 一个递归函数的漏洞及优化