Java JVM虚拟机
文章平均质量分 88
JVM
优秀小白熊
这个作者很懒,什么都没留下…
展开
-
JVM 再谈类的加载器
类加载器是JVM执行类加载机制的前提ClassLoader的作用:ClassLoader 是 Java 的核心组件,所有的 Class 都是由 ClassLoader 进行加载的,ClassLoader 负责通过各种方式将 Class 信息的二进制数据流读入 JVM 内部,转换为一个与目标类对应的 java.lang.Class 对象实例。然后交给 Java 虚拟机尽心链接、初始化等操作。原创 2023-12-18 09:13:50 · 2306 阅读 · 0 评论 -
JVM 类的加载过程详解
在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载按照 Java 虚拟机规范,从 Class 文件到加载到内存中的类,到类卸载出内存位置,它的整个生命周期包括如下七个阶段:其中验证、准备、解析3个部分统称为链接(Linking)从程序中使用类的过程来看。原创 2023-12-18 09:10:02 · 2308 阅读 · 0 评论 -
JVM 字节码指令集与解析举例
Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。原创 2023-12-18 09:05:00 · 2314 阅读 · 0 评论 -
JVM Class文件
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的**操作码(opcode)**以及跟随器后的零至多个代表此操作数的所需参数的操作数(operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码,如下:操作码+操作数如何解读供虚拟机执行的二进制字节码?解读Class文件的三种方式方式一:一个一个二进制的看,使用Binary Viewer方式二:使用idea安装 jclasslib bytecode viewer 插件实现阅读方式三:安装Jclasslibib客户端。原创 2023-12-18 09:04:26 · 2299 阅读 · 0 评论 -
JVM 垃圾回收器
垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。那么,Java常见的垃圾收集器有哪些?GC垃圾收集器是和JVM一脉相承的,它是和JVM进行搭配使用,在不同的使用场景对应的收集器也是有区别这种垃圾收集器大家了解,现在已经不用串行的了。而且在限定单核cpu才可以用。现在都不是单核的了。对于交互较强的应用而言,这种垃圾收集器是不能接受的。一般在Java web应用程序中是不会采用串行垃圾收集器的。截止JDK1.8,一共有7款不同的垃圾收集器。原创 2023-12-18 09:03:52 · 2308 阅读 · 0 评论 -
JVM 垃圾回收相关概念
强引用可以直接访问目标对象。强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指向对象。强引用可能导致内存泄漏。原创 2023-12-18 09:02:17 · 2313 阅读 · 0 评论 -
JVM 垃圾回收相关算法
总结一句话就是,除了堆空间外的一些结构,比如 虚拟机栈、本地方法栈、方法区、字符串常量池 等地方对堆空间进行引用的,都可以作为GC Roots进行可达性分析除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。比如:分代收集和局部回收(PartialGC)。原创 2023-12-18 09:01:41 · 2311 阅读 · 0 评论 -
JVM 垃圾回收概述
在提到什么是垃圾之前,我们先看下面一张图从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。原创 2023-12-18 09:01:04 · 2304 阅读 · 0 评论 -
JVM 直接内存 Direct Memory
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。使用下列代码,直接分配本地内存空间。原创 2023-12-17 00:21:43 · 2324 阅读 · 0 评论 -
JVM 对象实例化内存布局与访问定位
如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为key进行查找对应的 .class文件,如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class对象。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。如果是数组,还需要记录数组的长度。原创 2023-12-17 00:20:41 · 2314 阅读 · 0 评论 -
JVM 方法区
这次所讲述的是运行时数据区的最后一个部分从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理百度三面:说一下JVM内存模型吧,有哪些区?分别干什么的?蚂蚁金服:Java8的内存分代改进JVM内存分哪几个区,每个区的作用是什么?一面:JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?二面:Eden和survior的比例分配小米:jvm内存分区,为什么要有新生代和老年代。原创 2023-12-17 00:20:11 · 2309 阅读 · 0 评论 -
JVM 执行引擎
执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。原创 2023-12-17 00:22:23 · 2319 阅读 · 0 评论 -
JVM 堆
针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to关于垃圾回收:频繁在新生区收集,很少在老年代收集,几乎不再永久代和元空间进行收集新生代采用复制算法的目的:是为了减少内碎片从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。原创 2023-12-17 00:16:31 · 2313 阅读 · 0 评论 -
JVM 本地方法栈
因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。在Hotspot JVM中,直接将本地方法栈和虚拟机栈合二为一。本地方法栈,也是线程私有的。本地方法是使用C语言实现的。原创 2023-12-17 00:15:53 · 2322 阅读 · 0 评论 -
JVM 本地方法接口
简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C中,你可以用extern “c” 告知c编译器去调用一个c的函数。原创 2023-12-17 00:15:02 · 2319 阅读 · 0 评论 -
JVM 虚拟机栈
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里。原创 2023-12-17 00:14:28 · 2321 阅读 · 0 评论 -
程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。05、虚拟机栈它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。原创 2023-12-17 00:13:41 · 2321 阅读 · 0 评论 -
运行时数据区概述及线程
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。原创 2023-12-17 00:12:52 · 2318 阅读 · 0 评论 -
类加载子系统
完整图如下如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类ava.1ang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。原创 2023-12-17 00:11:55 · 2342 阅读 · 0 评论 -
JVM与Java体系结构
作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。原创 2023-12-17 00:10:57 · 2328 阅读 · 0 评论