我们在 Java 岗位的面试题中,大概率会碰到这样一个面试题:请你解释你对 JVM 内存模型的理解。
Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。
从事Java开发的小伙伴都知道Java有八种基本数据类型,分别是byte, boolean,char,short,int,float,long,double。其中各个数据类型所占的字节数如下图所示:
JVM全称是Java Virtual Machine ,既然是虚拟机,他终归要运行在物理机上
程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。
Class文件是以8个字节为单位的二进制流,紧凑排列,中间没有空隙;如果想查看一个Class文件除了通过winHex编译器看到字节码,也可以通过javap -verbose xxx.Class 输出字节码内容,这样看起来比较直观。
前一段时间写过一篇关于 JVM虚拟机之类加载的过程 的文章,其中讲述了Java虚拟机对类的处理。最近听了一次部门内部有关JVM的分享,自己也顺便回顾了之前阅读《深入理解JVM虚拟机》一书中所讲述的Java虚拟机对内存的管理,再次将自己理解的JVM内存模型分享给大家。
关于java的JVM这块儿知识,在项目做大之后,一些性能的优化,要涉及到数据库,一些缓存要放在内存中。还有一些JMS的消息传播等等,高大上的知识需要有JVM内存模型知识的支持。所以自问自答,来回答下面几个问题。
这是个什么鬼呢?我们都知道,CPU的计算时间是以分片的方式给到每个线程的,换句话说,所谓的并行其本质就是串行。比如线程A执行到了一部分,CPU将控制权给了线程B,那么线程A重新得到CPU的资源时,如何恢复工作呢?这个程序计数器就来帮助线程A找到其中间状态,从而恢复到正确的执行位置。程序计数器所占内存是线程私有的,同时也是Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。
该文介绍了JVM的内存模型,包括堆、栈、方法区、运行时常量池等。
Java堆用于存储对象实例,只要不断的创建对象并且保证GC Roots到对象之间有可达路径来避免垃圾回收,就可以触发Java堆的内存溢出异常
方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名为Non-Heap(非堆),目的是要将堆区分开来。
我之前写了一篇关于class文件重要性的,并且从宏观角度解释了下class文件的构成,文章直通车(不直通了,都在这个JVM专辑里面)
这是一张图🐰 📷 区域介绍 程序计数器 程序计数器是一块较小的内存空间,它可以被看作是指示当前线程执行的字节码的行号指示器。(即记录当前的执行位置) 在虚拟机的概念模型里,字节码解释器就是通过改变计数器得之来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过轮流切换并分配处理器执行执行时间来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程种的指令。因此,线程为了切换后能恢复到正
实现语言无关性的基础仍然是虚拟机和字节码存储格式。虚拟机不和包括Java在内的任何语言绑定,它与“Class”文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其它辅助信息。
JVM在执行java程序时的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
java 虚拟机在 java 程序执行过程中会将内存划分为若干个不同的数据区域,如下图所示:
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
Java 虚拟机作为运行 Java 程序抽象出来的计算机,具有内存管理的能力,像内存分配、垃圾回收等这些相关的内存管理问题,Java 虚拟机都会帮我们解决,所以作为一个 Java 程序员要比 C++ 程序员幸福,但是内存方面一旦出现问题,如果对虚拟机怎样使用内存不了解,就很难排查错误。
上篇文章提到过在Class结构表中,属性表存在于Class表,字段表和方法表中,是为了描述额外的信息。
Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。
Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个数据区域,这些区域各有各的用途。运行时数据区有五部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。 程序计数器: 是一块较小的内存空间。它可以看作是当前线程所执行的字节码的行号指示器。由于Java多线程是通过线程轮换分配处理器实现的,因此为了线程切换后能够恢复到正确位置,每条线程都需要一个独立的程序计数器。也就是说程序计数器是“线程私有”的。 如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行
Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个数据区域,这些区域各有各的用途。
我手上这本《Java并发编程的艺术》的版次是:2019年3月第1版第14次印刷。
内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。
由于多线程的切换时通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(内核)都只会执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,各线程间必须各自拥有一个独立的程序计数器,即 线程私有内存。
在前面的内容中属性表(attribute_info)已经出现多多次了,在Class文件、字段表、方法表中都可以携带自己的属性集合,用于描述某些场景专有的信息
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8 和之前的版本略有不同,下面会介绍到。
Java 虚拟机会在 Java 运行程序的过程中把它所管理的内存分为若干个不同的数据区域
本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。
执行 javac -parameters -d . HellowWorld.java
方法区 (Method Area or Permanent Generation):
最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。
java代码运行于JVM中,而jvm要运行java代码首先要做的就是加载字节码,也就是.java文件经过编译变成的.class文件。jvm运行的指令就是.class字节码。所以通过学习字节码的规范和规则能提升我们对代码执行过程的理解。
叮叮叮!我又来了。今天给大家带来的是关于Java虚拟机相关的面试题。这部分面试题的理论性有些强,不容易理解,但是偏偏还是很多面试官爱出的内容,没办法,难搞喔~~~
最近在读《深入理解Java虚拟机》,收获颇丰,记录一下,部分内容摘自原书。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁
静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性。Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的。
在Java中,JVM内存模型主要分为堆,方法区,程序计数器,虚拟机栈,本地方法栈,如下图
1、特点: 随着时间的推移,其中的元素会被垃圾回收器回收 2、涉及到的4中引用: 强引用:(StrongReference) 就是指在程序代码之中普遍存在的,例如以下代码:
Java入门该学习什么?Java如何快速入门? Java快速入门的六个技巧,帮你顺利入门Java!
主要包括: 线程共享 的数据区:方法区、堆。 线程私有 的数据区:程序计数器、虚拟机栈、本地方法栈。
我们知道java代码先编译为.class文件,然后再将.class文件交由jvm执行。在程序运行的这一过程中,jvm会将其管理的内存空间划分为不同的区域,这些区域各有各的用途,我们将其分为五类:
现如今的企业级Java应用开发已经日渐成熟,而越来越多的系统应用变得更加庞大而难以发现问题,JVM就是一个必须去重视和关注的难点,今天我们就开始对此进行认识、了解并深入其中。
Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本有所不同。
剑指offer(19-24)题解 19题解--顺时针打印矩阵 20题解--包含min函数的栈 21题解--栈的压入,弹出序列 22题解--从上往下打印二叉树 23题解--二叉搜索树的后序遍历序列 24题解--二叉树中和为某一值的路径 19题解–顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13
之前在学习过程中,很反复的看过关于Java虚拟机关于运行时数据区的一些文章,但是都没有很深刻的记忆,导致一看就忘,看完了一般用不了不久就会忘记。所以我决定自己写一篇笔记,即使后面忘了,也回来翻一翻。
D.Map map = Collections.synchronizedMap(new HashMap())
Java 的设计理念是 WORA(Write Once Run Anywhere,一次编写到处运行)。编译器将 Java 文件编译为 Java .class 文件,然后将 .class 文件输入到 JVM 中,JVM 执行类文件的加载和执行,最后转变成机器可以识别的机器码进行最终的操作。
程序计数器是一块较小的内存空间,可以看做是字节码解释器的行号指示器。字节码解释器在工作时通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、跳转等功能都是通过计数器实现的。 为了保证线程切换回来恢复到正确的位置,每个线程都有独立的程序计数器,每个线程独立存储,互不影响,是线程私有的。
领取专属 10元无门槛券
手把手带您无忧上云