
JVM
文章平均质量分 62
JVM的学习
it's okey
这个作者很懒,什么都没留下…
展开
-
jdk 1.8的新特性
接口的默认方法default和static函数式接口lambda表达式streams流OptionalDateAPI注解原创 2021-09-03 17:12:19 · 75 阅读 · 0 评论 -
JVM运行时数据区
程序计数器(线程私有)为什么要有程序计数器?方便字节码解释器工作,字节码解释器可以通过改变程序计数器来依次读取指令(让程序计数器保存下一条要执行的字节码指令),从而实现代码的流程控制,顺序执行,选择,循环,异常处理在多线程下,可以程序计数器可以记录线程的执行的位置,可以在线程上下文切换的时候,恢复线程继续执行。程序计数器的底层结构。程序计数器是一快很小的内存区域,可以看成是线程所执行的字节码指示器。程序计数器的注意点。程序计数器是不会出现OOM的错误的内存区域,它的生命周期随线程开始而原创 2021-08-29 17:15:51 · 99 阅读 · 1 评论 -
内存泄露的八种情况
内存泄露的八种情况静态集合类单例模式,被单例对象所引用的对象不容易被回收。内部类持有外部类各种连接,如数据库连接,网络连接和IO连接等变量不合理的作用域改变hash值缓存泄露监听器和回调...原创 2021-04-13 19:49:02 · 163 阅读 · 0 评论 -
JVM - 堆区 为什么在jvm中,SurvivorRatio= 8,但是在visualVM中的实际比值确实6:1:1?
为什么在jvm中,SurvivorRatio = 8,但是在visualVM中的实际比值确实6:1:1?由于jvm中,默认开启了+UseAdaptiveSizePolicy ,堆内存的中Eden和survivor0,survivor1的比值会被自动优化,就会出现,-XX:SurvivorRatio=8 ,但是实际却不是的情况。想改变回来,就得关闭-UseAdaptiveSizePolicy,在显示的适应-XX:SurvivorRatio=8,比例就会改变为8原创 2021-03-25 10:22:45 · 842 阅读 · 0 评论 -
JVM - 双亲委派机制的优势和劣势
双亲委派机制的优势和劣势双亲委派机制优势避免类的重复加载, 确保一个类的全局唯一性Java 类随着它的类加载器一起具备了一种带有优先级的层级关系, 通过这种层级关系可以避免类的重复加载, 当父亲已经加载了该类时, 就没有必要子ClassLoader 再加载一次保护程序安全, 防止核心 API 被随意篡改代码支持双亲委派机制在 java.lang.ClassLoader.loadClass(String, boolean) 接口中体现。该接口的逻辑如下:先在当前加载器的缓存中查找有无目原创 2021-03-16 19:39:24 · 4125 阅读 · 0 评论 -
静态变量是放在方法区还是堆里,我看《深入理解Java虚拟机》书里写的是放在方法区里
静态变量是放在方法区还是堆里,我看《深入理解Java虚拟机》书里写的是放在方法区里?回答:从《Java虚拟机规范》所定义的概念模型来看,所有Class相关的信息都应该存放在方法区之中,但方法区该如何实现,《Java虚拟机规范》并未做出规定,这就成了一件允许不同虚拟机自己灵活把握的事情。JDK7及其以后版本的HotSpot虚拟机选择把静态变量与类型在Java语言一端的映射class对象存放在一起,存储于Java堆之中。...原创 2021-03-12 22:30:16 · 4092 阅读 · 3 评论 -
JVM -运行时数据区-方法区(jdk7的永久代,jdk8的元空间)
方法区前言这次所讲述的是运行时数据区的最后一个部分从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理栈、堆、方法区的交互关系下面就涉及了对象的访问定位Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行原创 2021-03-03 21:12:39 · 1082 阅读 · 1 评论 -
JVM - 堆区 - 内存细分和OutOfMemory
堆的核心概述:内存细分现代的垃圾收集器大部分都集中于分代收集理论,堆空间细分为:约定:新生区《------》新生代 《------》年轻代 , 养老区《------》老年区 《------》老年代代 , 永久区区《------》永久代堆空间内部结构(JDK 7)堆空间内部结构(JDK 8)设置堆空间内存大小与OOM堆空间大小设置Java堆区用于存储Java对象实例,那么堆的大小在jvm启动时就已经设定好了,大家可以通过选项"-Xmx"和"-Xms"来设置“-Xms”用于表示堆区原创 2021-02-28 21:17:34 · 146 阅读 · 0 评论 -
JVM - 本地方法栈
本地方法栈Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个outofMemoryError异原创 2021-02-27 11:25:27 · 101 阅读 · 0 评论 -
JVM - 本地方法接口
本地方法接口什么是本地方法简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “c” 告知c++编译器去调用一个c的函数。“A native method is a Java method whose implementation is provided by non-java co原创 2021-02-27 11:19:42 · 104 阅读 · 0 评论 -
JVM - 运行时数据区-虚拟机栈(局部变量表,操作数栈,栈顶部缓存,逃逸分析等)
局部变量表局部变量表:Local Variables,被称之为局部变量数组或本地变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。原创 2021-02-03 08:17:51 · 481 阅读 · 0 评论 -
JVM - 程序计数器
程序计数器介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自原创 2021-01-29 12:01:45 · 118 阅读 · 0 评论 -
JVM - 运行时数据区概述及线程
运行时数据区概述及线程前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西**(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎**,将通过准备的东西进行制作成精美的菜品内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,原创 2021-01-28 09:24:08 · 173 阅读 · 0 评论 -
JVM - ClassLoader的双亲委派机制(沙箱安全机制)
双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。工作原理如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类加载任务,就成功返原创 2021-01-27 10:55:32 · 292 阅读 · 0 评论 -
JVM(ClassLoader) - 类加载器的分类(引导类加载器,扩展类加载器,系统类加载器)
类加载器的分类JVM支持两种类型的类加载器 。分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示这里的四者之间是包含关系,不是上层和下层,也不是子系原创 2021-01-27 08:59:53 · 685 阅读 · 2 评论 -
JVM类加载子系统 (ClassLoader) - 加载,链接,初始化
类加载子系统完整图类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。(例如:CA FE BA BY)ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)class fi原创 2021-01-25 17:21:53 · 370 阅读 · 0 评论 -
JVM的发展历程
JVM的发展历程Sun Classic VM早在1996年Java1.0版本的时候,Sun公司发布了一款名为sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。这款虚拟机内部只提供解释器。现在还有及时编译器,因此效率比较低,而及时编译器会把热点代码缓存起来,那么以后使用热点代码的时候,效率就比较高。如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合原创 2021-01-25 11:31:30 · 140 阅读 · 0 评论 -
JVM的架构模型
JVM的架构模型Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。具体来说:这两种架构之间的区别基于栈式架构的特点设计和实现更简单,适用于资源受限的系统;避开了寄存器的分配难题:使用零地址指令方式分配。指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。不需要硬件支持,可移植性更好,更好实现跨平台基于寄存器架构的特点典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟原创 2021-01-19 08:41:04 · 169 阅读 · 0 评论 -
jvm的体系结构,执行流程
虚拟机与java虚拟机虚拟机Java虚拟机jvm的位置java的体系结构java的整体结构java代码执行流程虚拟机所谓的虚拟机(virtual Machine),就是一台虚拟的计算机。本质上一款软件,用来执行虚拟的计算机指令。大体上,虚拟机分为系统虚拟机和程序虚拟机。比如virtual Box,Mware就是属于系统虚拟机,他们是对物理计算机的仿真,提供一个可以运行的完整的操作系统的软件平台。程序虚拟机的典型代表就是java的虚拟机,它专门为执行单个计算机程序而设计,在Java虚原创 2021-01-17 08:52:34 · 125 阅读 · 0 评论 -
JVM 本地方法栈,堆
本地方法栈主要存储了很多,c/c++代码,而非java代码因为,jvm需要通过c/c++代码实现和操作系统之间的交互。堆(heap)Heap 堆通过new关键字,创建对象都会使用到堆内存。特点它是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制堆内存诊断jps工具1. 查看当前系统中有哪些java进程jmap工具1. 查看堆内存占用情况 jmap -head 进程id(非连续性)jconsole工具1. 图形界面的,多功能的检测工具,可以连续检测原创 2021-01-04 21:37:38 · 125 阅读 · 0 评论 -
JVM 内存结构-程序计数器,虚拟机栈
程序计数器1.1定义作用,是用于记住下一条jvm指令的执行地址特点线程私有的,就是每个线程都有自己的程序计数器规定不会产生内存溢出本质,程序计数器的本质就是一个寄存器,在jvm的二进制码转换成机器码的过程中,发挥作用。虚拟机栈定义Java Virtual Machine Stacks (Java 虚拟机栈)每个线程都只能有一个虚拟机栈(线程私有),对应着当前执行的那个方法作用线程每当执行一个方法,就压入虚拟机栈中;每当执行完一个方法,就从中弹出。原创 2021-01-04 21:24:46 · 119 阅读 · 1 评论