JVM
文章平均质量分 71
煎丶包
这个作者很懒,什么都没留下…
展开
-
说一说JVM类加载子系统使用的各种类加载器
说一说JVM类加载子系统使用的各种类加载器之前我们在《从JVM层面谈一谈类的加载过程》这篇文章中,详细的介绍了类加载的过程。我们说一个类,从class字节码二进制数据流转化为类模板加载到系统内存中,这一过程是由类加载子系统实现的,确切的说是由类加载子系统中的各种类加载器实现的。这篇文章就来谈一谈都有哪些类加载器以及它们的作用都是什么。所有的类都是由ClassLoader进行加载的,Classloader负责通过各种方式将类信息的二进制数据流读入到JVM内部的方法区,形成一个类模板数据结构,进而转换为一个原创 2021-09-18 21:55:33 · 350 阅读 · 0 评论 -
从JVM层面谈一谈类的加载过程
从JVM层面谈一谈类的加载过程之前在Java内存区域详解(万字总结!一篇入魂!点赞收藏!)这篇文章中详细讲解了Java内存区域,我们下面再放一张图,回顾一下Java内存区域都划分为了哪几部分通过JVM整体架构来看,Java内存区域,也就是运行时数据区,是JVM的核心。我们知道Java内存区域是用来存放程序运行过程中产生的数据的区域,如果我们要向将Java程序运行起来,首先必须把编译出来class文件加载到内存中,而负责加载的就是JVM中的类加载子系统,它负责将编译好的class文件加载到内存中。这篇文原创 2021-09-17 17:24:55 · 148 阅读 · 0 评论 -
结合JVM深入谈一谈Synchronized关键字的神奇之处
结合JVM深入谈一谈Synchronized关键字的神奇之处今天就来聊一聊Synchronized这个关键字。一提到Synchronized这个关键字,可能你马上联想到同步、加锁、多线程并发等等这些词语,仿佛感觉Synchronized关键字出镜率很高,感觉哪里都有它的身影。其实,Synchronized在很早的JDK版本中就已经存在了,可以说是元老级别的存在,主要解决的是多线程之间同步的访问资源,被Synchronized关键字修饰的方法或者代码块在任意时刻只能有一个线程执行。在早期的JDK版本中,S原创 2021-09-11 19:49:35 · 162 阅读 · 0 评论 -
Java垃圾回收机制详解(万字总结!一篇入魂!)
Java垃圾回收机制详解之前在《Java内存区域详解》这篇文章中,详细介绍了JVM内存区域的划分,以及创建对象时内存的分配情况。Java的自动内存管理机制,除了自动申请内存还会自动释放内存,这篇文章就来说一说Java内存回收机制。首先我们要明确几点,问什么要回收内存?哪些内存是需要回收的?什么时候回收?应该怎样回收?(Why?What?When?How?)举个例子,垃圾桶,你平时制造出来的垃圾都随手扔到了垃圾桶里,这垃圾桶就好比堆空间,你扔进去一个垃圾,就好比在堆空间自动申请的一块内存来存放这个垃圾,原创 2021-09-08 10:56:33 · 2350 阅读 · 0 评论 -
Java内存区域详解(万字总结!一篇入魂!点赞收藏!)
Java内存区域详解JVM自动内存管理机制,可以使得不像C/C++语言那样,需要手动的申请和释放内存,Java将内存的申请和释放完全交给JVM来管理,所以并不容易出现内存泄漏和内存溢出的问题。但是并不代表不会发生,所以我们必须要熟悉JVM,要熟悉JVM自动内存管理的机制,这样我们在发生内存问题时,才知道该如何下手去解决。JVM在运行时会把管理的内存划分为不同的数据区域,包括线程共享的堆、方法区,以及线程私有的虚拟机栈、本地方法栈、程序计数器。一共五大部分。但是在JDK 8前后,内存区域的划分出现了变动,原创 2021-09-04 15:27:44 · 965 阅读 · 0 评论 -
【Go语言实现JVM】根据Java命令编写命令行工具
一、Java应用程序运行命令Java应用程序需要有一个入口,而这个入口就是main()方法,包含main()方法的这个Java类叫作主类。JVM规范并没有规定哪个类是主类,所以我们可以自己创建一个主类,只要包含main()方法即可。虽然我们可以自定义一个主类,但是如何告诉JVM哪个类是主类呢?实际上JVM是通过java命令来加载并启动主类,主类名可以由命令行参数指定我们在cmd命令窗口执行java命令从回显中可以看到java命令的具体用法java [-options] class [args原创 2021-08-01 21:15:08 · 1611 阅读 · 1 评论 -
从字节码角度分析i++与++i以及i+=1与i=i+1运算操作
变量的自增操作,如i++++ii+=1i=i++这些自增操作的算术运算可能计算的最后结果是一样,仅从代码层面很难看出它们的异同。下面将从字节码指令的角度去分析这些操作的不同之处。i++与++i的区别如果只是进行变量的自增的运算,不涉及赋值操作,那么i++和++i在字节码指令层面上是执行相同的指令可以看出i++与++i的字节码指令是一样的,都是先将操作数10压入操作数栈,然后保存到局部变量表索引为1的位置,也就是保存变量i的位置,然后将局部变量表索引为1的位置的变量的值加1。但是如果原创 2021-07-29 18:10:07 · 2421 阅读 · 0 评论 -
运行时数据区——方法区
一、栈、堆、方法区的交互关系变量名存放在栈帧的局部变量表中,创建出来的对象实例数据存放在堆中,对象类型的具体数据则存放在方法区。同属对象实例中维护一个指向对象类型的指针,用于获取该对象实例的类型数据。二、方法区方法区在逻辑上是属于堆的一部分,但是方法区可以看作是一块独立于Java堆的内存空间方法区与堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展方法区的大原创 2021-07-22 10:14:09 · 153 阅读 · 0 评论 -
运行时数据区——堆
一、堆的概述一个进程对应一个JVM实例,也就是一个进程对应一个运行时数据区。一个进程又包含多个线程,这些线程共享了方法区和堆,但是每个线程都有各自的程序计数器、本地方法栈和虚拟机栈。一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,是JVM管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB),所以堆空间不一定是所有线程原创 2021-07-20 11:31:27 · 260 阅读 · 0 评论 -
运行时数据区——本地方法栈
本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么java虚拟机将会抛出一个OutOfMemoryError异常。本地方法是原创 2021-07-19 08:54:48 · 70 阅读 · 0 评论 -
运行时数据区——Java虚拟机栈
一、Java虚拟机栈每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,每一个栈帧对于一个方法Java虚拟机栈是线程私有的Java虚拟机栈的生命周期和线程一致虚拟机栈主要管理程序的运行,保存方法的局部变量、部分结果,并参与方法的调用和返回二、栈的优势栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器JVM操作栈,当方法执行时,执行入栈操作,当方法结束时,执行出栈操作栈不存在垃圾回收问题,但是存在栈溢出问题三、栈的存储单位每个线程都有自己的栈,栈中的数据都是以栈原创 2021-07-18 22:41:29 · 2903 阅读 · 5 评论 -
运行时数据区——程序计数器
PC寄存器PC寄存器是用来存储指向下一条指令的地址,也就是即将要执行的指令代码,由执行引擎读取下一条指令PC寄存器是一块很小的内存空间,也是运行速度最快的存储区域每个线程都有自己的程序计数器,是线程私有的,程序计数器的生命周期与线程的生命周期保持一致任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址,但是如果正在执行native方法,则是未指定值(undefined)程序计数器是程序控制流的指示器,分支、循环、跳转、异常处原创 2021-07-18 14:52:47 · 130 阅读 · 0 评论 -
双亲委派机制
一、双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交给父类处理,它是一种任务委派模式。二、工作原理如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行如果父类加载器还存在其父类加载器,则会进一步向上委托,依次递归请求,最终请求将到达顶层的启动类加载器如果父类加载器可以完成类加载原创 2021-07-18 10:16:29 · 110 阅读 · 0 评论 -
类加载器的分类
类加载器的分类引导类加载器(BootStrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)获取每一个不同的类加载器原创 2021-07-18 09:17:38 · 169 阅读 · 0 评论 -
类加载器与类的加载过程
一、类加载器子系统类加载器子系统分为加载阶段、链接阶段、初始化阶段类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识ClassLoader只负责class文件的加载,class文件是否能运行,则由执行引擎决定加载的类信息存放在一块称为方法区的内存空间,除了类的信息外,方法区还会存放运行时常量池信息,可能还包含字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)二、类的加载过程1、Loading加载阶段通过一个类原创 2021-07-14 20:06:02 · 164 阅读 · 1 评论 -
JVM的生命周期
一、虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的二、虚拟机的执行Java虚拟机的任务就是执行Java程序程序开始执行时虚拟机才运行,程序结束时虚拟机就停止执行一个Java程序,实际上执行的是一个Java虚拟机的进程三、虚拟机的退出以下几种情况会导致虚拟机的退出:程序正常执行结束程序在执行过程中遇到了异常或错误而异常终止由于操作系统用现错误而导致原创 2021-07-14 17:26:06 · 90 阅读 · 0 评论 -
JVM整体结构与Java代码执行流程
JVM整体结构Java代码执行流程Java源文件经过Java编译器生成.class字节码文件Java虚拟机包含类加载器、字节码校验器、执行引擎类加载器将字节码加载到JVM内部字节码校验器校验字节码文件是否符合JVM规范执行引擎会翻译字节码并解析执行,再由JIT编译器** **字码执行引擎会将字节码翻译成机器码交给操作系统执行...原创 2021-07-13 17:09:41 · 87 阅读 · 0 评论