
jvm
文章平均质量分 82
水巷石子
大道至简
展开
-
JVM之Native本地方法接口和本地方法库
什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如c。这个特征并非Java所特有,很多其它的编程语言都有这一机制,印如在C++中,你可以用extern "c"告知C++编译器去调用一个c的函数。官方回答:"A native method is a Java method whose implementation isprovided by non-j.原创 2021-05-29 19:43:13 · 670 阅读 · 5 评论 -
jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程
public class OperandStackTest { public void testAddOperation() { byte i = 15; int j = 8; int k = i + j; }byte、short、char、boolean:都是int型来保存的(当然int本身也是用int型来保存的),long和double都是占64位。所以在jclasslib中存的是用int类型存储的,bipush。取的时候,也是用原创 2020-11-20 21:36:28 · 1295 阅读 · 5 评论 -
jvm-操作数栈(Operand Stack)
每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-out)的操作数栈,也可以称之为表达式栈(Expression stack) 。操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。l某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用它们后再把结果压入栈。比如:执行复制、交换、求和等操作例子:比如现在要进行一个15+8的操作,那么是先将15和8进行入栈操作,然后再执行add..原创 2020-11-18 14:28:51 · 1151 阅读 · 2 评论 -
jvm中的变量分类-类加载
变量的分类:按照数据类型分:基本数据类型引用数据类型按照在类中声明的位置分:成员变量:在使用前,都经历过默认初始化赋值类变量:linking的prepare阶段:给类变量默认赋值 —》initial阶段:给类变量显式赋值即静态代码块赋值实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值局部变量:在使用前,必须要进行显式赋值的!否则,编译不通过。类变量与局部变量的对比参数表分配完毕之后,再根据方法体内定义的变量的顺序和作用域分配。我们知道类变量原创 2020-11-17 15:33:54 · 782 阅读 · 1 评论 -
jvm中关于slot的理解
jvm中关于slot的理解参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束。局部变量表,最基本的存储单元是slot(变量槽)局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference), returnAddress类型的变量。在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。byte 、short 、char在存储前被转换为int,boolean也原创 2020-09-23 20:41:39 · 6838 阅读 · 0 评论 -
JVM局部变量表(Local Variables)
JVM局部变量表(Local Variables)局部变量表也被称之为局部变量数组或本地变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量原创 2020-09-22 20:31:38 · 6369 阅读 · 0 评论 -
JVM栈帧的内部结构
栈的内部结构每个栈帧中存储着:局部变量表(Local variables)操作数栈(operand stack)(或表达式栈)动态链接(Dynamic Linking)(或指向运行时常量池的方法引用)方法返回地址(Return Address)(或方法正常退出或者异常退出的定义)一些附加信息...原创 2020-09-22 17:49:27 · 4527 阅读 · 0 评论 -
虚拟机栈-01
虚拟机栈-011. 虚拟机栈概述虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的栈与堆栈是运行时的单位,而堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的向题,即数据怎么放、放在哪儿。虚拟机栈基本内容Java虚拟机栈是什么?Java虚拟机栈(Java Vir原创 2020-09-19 15:02:30 · 3123 阅读 · 0 评论 -
JVM程序计数器(PC寄存器)
JVM程序计数器(PC寄存器)pc Register介绍JVM中的程序计数寄存器(Program counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为Pc计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的Pc寄存器是对物理PC寄存器的一种抽象模拟。作用:PC寄存器用来存储指向下一条指令的地址,也即将原创 2020-09-19 10:25:49 · 3587 阅读 · 1 评论 -
JVM虚拟机之线程
JVM虚拟机之线程线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run ()方法。守护线程、普通线程(具体区别,后面会跟新说明)JVM系统线程如果你使用jconsole或者是任何一个原创 2020-09-16 08:54:46 · 3478 阅读 · 1 评论 -
运行时数据区概述及线程
运行时数据区概述及线程运行时数据区图:运行时数据区在整个jvm中扮演的角色图解:内存是非常重要的系统资源,是硬盘和cPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。Java虚拟机定义了若千种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而原创 2020-09-14 20:55:32 · 3041 阅读 · 1 评论 -
双亲委派机制
双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。工作原理如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类加载任务,就成原创 2020-09-12 11:32:44 · 2368 阅读 · 0 评论 -
深入理解JVM类加载器ClassLoader
深入理解JVM类加载器ClassLoaderclassLoader类,它是一个抽象类,其后所有的类加载器都继承自classLoader(不包括启动类加载器)方法说明getParent()返回该类加载器的父类加载器。loadClass(String name)加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。findClass(String name)查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。原创 2020-09-12 11:09:02 · 2447 阅读 · 0 评论 -
JVM类加载类的分类
JVM类加载类的分类虚拟机自带的加载器启动类加载器(引导类加载器,Bootstrap ClassLoader)这个类加载使用C/C++语言实现的,嵌套在JVM内部。它用来加载Java中的核心库((JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.pa路径下的内容),用于提供JVM自身需要的类)并不继承自java.lang.classLoader,没有父加载器。加载扩展类和应用程序类加载器,并指定为他们的父类加载器。出于安全考虑,原创 2020-09-10 20:20:43 · 1922 阅读 · 3 评论 -
JVM类加载过程实例
JVM类加载过程实例package com.lbl;public class ClassInitTest { private static int num=1; static { num=2; number=20; } private static int number=10; public static void main(String[] args) { System.out.println(ClassI原创 2020-09-08 20:05:26 · 1066 阅读 · 0 评论