java:JVM及相关概念

1、概述

我们实际的开发中,先利用JDK(调用本地的API)开发属于自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解释这些字节码,映射到CPU指令集或OS的系统调用。所以在讲JVM之前,我们先来讲一下容易和JVM搞混的两个概念JDK和JRE。简单粗暴的理解就是:JDK包含JRE,JRE包含JVM

JVM:Java虚拟机,它只认识xxx.class这种类型的文件,它能够将class文件中的字节指令进行识别,并调用操作系统上API完成动作。所以说,jvm是Java能够跨平台的核心。

JRE:Java运行时环境,jre包括jvm和java核心类库与支持文件。

JDK:Java开发工具包,jdk是整个java开发的核心,包括了java运行环境(jre)、一堆java工具(javac、java、jdb等)和java基础类库(即Java API包括rt.jar)。

2、JVM基本概念

2.1 什么是JVM

jvm中文名称叫做Java虚拟机,它是由软件技术模拟出来计算机运行的一个虚拟的计算机。

jvm也充当这个一个翻译官的角色,我们编写出java程序后,是不能直接被操作系统所识别的,这时候jvm的作用就体现出来了,它负责把我们的程序翻译给操作系统听,告诉它我们的系统需要做什么操作。

我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,这就是Java能一次编译,到处运行的原因。

2.2、JVM基本原理介绍

jvm体系总体分四大块:

  • 类的加载机制
  • jvm内存结构
  • GC算法 垃圾回收
  • GC分析 命令调优

3、JVM运行时数据区

运行的程序是内容是放在运行时数据区中的,如上图蓝色那块依次来说明一下:

3.1 堆

保存所有引用类型的真是信息(线程共享),也是说那些new出来的对象都是放在这块区域的。

3.2 虚拟机栈

线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表操作数栈动态链接方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。当一个方法运行到一半需要调用另一个方法时,就创建一个新的栈帧表示新调用的方法,将原来那个方法压入栈中。当方法运行完毕,栈帧出栈,原来方法处于栈顶接着运行。和栈这一数据结构一样,虚拟机栈里面的栈帧遵循后进先出的原则。

3.3 方法区

又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。同时方法区里面还有一个叫常量池的地方,String的字符串等常量存储就存储在那边。

3.4 程序计数器

一个非常小的内存空间,用来保存程序执行到的位置(线程私有)。下面是一个程序计数器的演示:

public class TestDemo{
    public static void main(String args[]){
        String str = null;
        str.length();
    }
}

  上面程序会报空指针异常,如下图,在报的这个异常中,有一行日志 at TestDemo,main(TestDemo.java:4) 代表程序运行到TestDemo 中main()函数第四行的时候发生的错误,就是通过程序计数器来记录这个程序运行的位置的。

3.5 本地方法栈

和虚拟机栈类似,不过本地方法栈里面运行的方法不是用java写的,一般是用c或c++写的为虚拟机使用到Native方法服务,也有类似栈帧的的概念。

4、内存模型和垃圾回收

原文地址:https://www.cnblogs.com/mengY/p/12202486.html

时间: 2024-10-28 22:47:54

java:JVM及相关概念的相关文章

Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis

目录 1. JAVA JVM 2. Java JNI: Java Native Interface 3. Java Create New Process Native Function API Analysis In Linux 4. Java Create New Process Native Function API Analysis In Windows 1. JAVA JVM 0x1: JVM架构简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种

Java JVM使用哪种编码格式

Java JVM使用哪种编码格式 A ASCII characters  B Unicode characters C Cp1252 D UTF-8 E GBK F GBK2312 答案:B   在JVM内部,统一使用Unicode Java JVM使用哪种编码格式

java JVM

1.ClassLoader(类加载器) 1.加载:查找并加载类的二进制数据 2.连接 —验证:确保被加载的类的正确性(防止不是通过java命令生成的class文件被加载) —准备:为类的静态变量分配内存,并将其初始化为默认值(如int默认值为0) —解析:把类中的符号引用转换为直接引用 3.初始化:为类的静态变量赋予正确的初始值(即代码中指定的值 例:public static int a = 2) JAVA程序对类的使用方式可以分为两种 —主动使用(六种) —被动使用(除了主动使用的六种方法,

java jvm概述

java jvm 有分层的思想. java类..java文件,源文件,源代码,源程序 编译器不能把源代码直接编译成0101,除非是java语言写的操作系统. windows认识的可执行文件是.exe文件,windows操作系统可以把.exe文件翻译成0101.

Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解

   我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于哄抢都没得喝.线程讲协作,我们可以理解为我们在医院看病的时候,我们要先挂号,才能看病.现在医院有很多病人排队,怎么协调病人都有秩序的先挂号,后看病.本篇文章的重点不在此,也不是在此一下子能分析完,我们先从Java JVM的角度来理解多线程的一些方面. 我们知道多线程间的数据同步,我们是通过加锁的操作

Powershell远程在Azure A7虚拟机执行Java JVM失败

近期.使用Powershell脚本在A7 (8核,56G内存)配置的 Azure VM(Virtual Machine.虚拟机)上远程运行Java JVM时 (java.exe -version).总是失败并返回例如以下的错误信息. 相同的Powershell脚本.在其他低于A7配置的VM上远程运行一切正常:此外,假设使用远程桌面登录到VM上,再进行相同的操作,一切运行正常. Error occurred during initialization of VM Unable to allocat

老男孩教育高端技术沙龙活动分享--JAVA JVM调优实战

本周末举办!,禁止空降,报名截止到5月8日19点报名方式见咨询QQ:  41117397 70271111电话: 01060747396  18911718229 18600338340官方群 246054962 208160987(标明51CTO) 报名条件:1.曾经支持关注老男孩博客及视频的朋友,需提供截图3条以上支持老男孩教育的评论(灌水不算).2.VIP运维班学员月薪低于9000(以提交的OFFER为准)或者没有实际维护JAVA环境(tomcat,resin等)的禁止报名.3.第10期以

java JVM垃圾回收机制

Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构.于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出了垃圾回收的概念,用于处理C语言等不停的析构操作,而这时Java还没有出世呢!所以实际上GC并不是Jav

java Jvm工作原理学习笔记

一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点 b)     运行.main()作为该程序初始线程的起点,任何其他线程均由该线程启动.JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己