
JVM
文章平均质量分 84
JVM
ximeneschen
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java9及之后关于类加载器的新特性
为了保证兼容性,。原创 2023-12-09 17:49:44 · 764 阅读 · 0 评论 -
自定义类加载器加载网络Class
ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(BootstrapClassLoader)本身没有父类加载器,但可以用作其它ClassLoader实例的的父类加载器。 当为什么要使用双亲委托这种模型呢?因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的Stri原创 2022-07-04 16:53:01 · 435 阅读 · 0 评论 -
Tomcat的加载机制及破坏双亲委派机制
一、双亲委派机制对于JVM来说因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。对于TomcatTomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),默认情况下:各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。 如果在context.xml中设置了&l原创 2022-05-28 09:12:26 · 1116 阅读 · 0 评论 -
Minor GC、Major GC、Full GC
一、年轻代年轻代是所有新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做Minor GC。年轻代被分为3个部分——Enden区和两个Survivor区。年轻代空间的要点:大多数新建的对象都位于Eden区。当Eden区被对象填满时,就会执行Minor GC。并把所有存活下来的对象转移到其中一个survivor区。Minor GC同样会检查存活下来的对象,并把它们转移到另一个survivor区。这样在一段时间内,总会有一个空的survivor区。经过多次GC周期后原创 2022-03-04 14:17:40 · 211 阅读 · 0 评论 -
Reference和ReferenceQueue
我们都知道在堆里面存放着Java中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。那么gc怎么判断一个对象是不是垃圾呢判断对象是否存活有两种计数算法:引用计数法、可达性分析法引用计数法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一 就是如果一个对象没有被任何引用指向,则可视之为垃圾。可达性分析法:通过一系列的称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路转载 2021-04-25 15:49:14 · 248 阅读 · 0 评论 -
JVM查看GC日志
一、如何打印出JVM GC日志需要在系统的JVM参数中加入GC日志的打印选型,jvm参数如下所示:-XX:NewSize=5242880-XX:MaxNewSize=5242880-XX:InitialHeapSize=10485760-XX:MaxHeapSize=10485760-XX:SurvivorRatio=8-XX:PretenureSizeThreshold=10485760-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+Print转载 2021-04-23 14:50:42 · 5318 阅读 · 0 评论 -
jvm垃圾收集器的发展史及回收算法
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection ,对应的产品我们称为 Garbage Collector 。1999年,随JDK 1.3.1 一起来的是串行方式的 Serial GC ,它是第一款GC。ParNew GC 是 Serial GC的多线程版本。2002年2月26日,Parallel GC 和 Concurrent Mark Sweep GC( 即 CMS ) 跟随JDK1.4.2 一起发布。 Parallel GC 在 JDK6 之后成为 Hotspo原创 2021-04-20 17:22:15 · 322 阅读 · 1 评论 -
全局变量、成员变量、类变量、静态变量、实例变量、局部变量的定义与区别
全局变量全局变量又叫成员变量,它是声明在类里,函数,静态语句块外的变量,全局变量又分为类变量(静态变量)、实例变量两种.通过代码来看一下:private int i;//实例变量private static int j;//类变量实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。而由static修饰的类变量(静态变量)在类装载的时候就会被初始化,也就是说一处修改多处改变.局部变量方法内定义的变量叫局部变量,因为只能在方法内部使用,固不可以用private,public,pro转载 2021-04-15 09:49:23 · 2449 阅读 · 0 评论 -
JVM统介——Java虚拟机架构
0. 前言Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性。平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行。JVM屏蔽了与具体平台相关的信息,使程序可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现Java平台无关性。1. JVM结构图JVM = 类加载器 classloader + 执行引擎 executionengine + 运行时数据区域 runtime转载 2021-04-14 16:19:44 · 103 阅读 · 0 评论 -
字符串常量池、class常量池和运行时常量池
在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体转载 2021-04-14 10:44:19 · 231 阅读 · 0 评论 -
JVM逃逸分析(同步省略、标量替换、栈上分配)
在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段编译是把.class转换成机器指令的过程。第一段编译就是javac命令。在第二编译阶段,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。这就是传统的JVM的解释器(Interpreter)的功能。为了解决这种效率问题,引入了 JIT(即时编译) 技术。引原创 2021-04-13 15:40:10 · 354 阅读 · 0 评论 -
JVM_07 Class文件结构
一、概述(了解)字节码文件的跨平台性(了解)①. Java语言:跨平台的语言当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译这个优势不再那么吸引人了。Python PHP perl ruby lisp等有强大的解释器跨平台似乎已经快成为一门语言必须的特征②.Java虚拟机:跨语言的平台:(Java虚拟机不和包括java在内的任何语言绑定,它只与class文件这种二进制文件格式所关联。无论使用何种语言进行软件开发,只要将源文件编译为正确的Class文件,转载 2021-01-13 15:39:35 · 103 阅读 · 0 评论 -
JVM_06 垃圾收集器[ 三 ]
面试遇到面试官问这部分可以这样回答:不同的厂商会考虑使用不同的JVM,不同的JVM会使用不同的垃圾收集器,下面我介绍下主流的垃圾收集器有哪些(主流的7种),下面你就可以展开去说明七种垃圾收集器的每一个细节。(1).截止JDK1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器(2).不同厂商、不同版本的虚拟机实现差别很大。HotSpot 虚拟机在JDK7/8后所有收集器及组合(连线),如下图:一、 评估GC的.转载 2021-01-13 15:34:21 · 197 阅读 · 0 评论 -
JVM_06 垃圾回收相关概念[ 二 ]
一、 System.gc()的理解在默认情况下,通过System.gc( )或者Runtime . getRuntime( ).gc( )的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC)。[不保证一定会发生垃圾收集,只是给jvm发出提示]JVM实现者可以通过system.gc( )调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,转载 2021-01-13 14:47:46 · 144 阅读 · 0 评论 -
JVM_06 垃圾回收相关算法 [ 一 ]
前言:(1). 判断对象存活的两种方式(引用计数算法、枚举根节点做可达性分析)(2).标记阶段(引用计数法、枚举根节点做可达性分析)(3).清除阶段(复制算法、标记清除算法、标记整理(压缩)算法、分代收集、增量收集算法、分区算法)一、 引用计数法原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收最大的缺陷:无法解决循环引用的问题,gc永远都清除不了(这也转载 2021-01-13 14:24:02 · 133 阅读 · 0 评论 -
JVM_05 执行引擎(Execution Engine)
总结写在最前面:在这里插入图片描述①. 执行引擎概述1>. 执行引擎概述①. 执行引擎是Java虚拟机的核心组成部分之一②. JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表和其他辅助信息③. 那么,如果想让一个Java程序运行起来、执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机转载 2021-01-13 13:56:04 · 104 阅读 · 0 评论 -
JVM_04 对象的实例化+内存布局+访问定位+直接内存
一、前言:(1).new 最常见的方式 | 变形1 : Xxx的静态方法 | 变形2 : XxBuilder/XxoxFactory的静态方法(2).Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public(3).Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求(4).使用clone() :不调用任何构造器,当前类需要实现Cloneable接口,实现clone()(5).使用反序列化:从文件中转载 2021-01-11 18:26:10 · 178 阅读 · 2 评论 -
JVM_03 运行时数据区 [ 方法区]
一、方法区的概述方法区在JVM启动的时候被创建,并且它的实际的物理内存空间和Java堆区一样都可以是不连续的 | 关闭Jvm就会释放这个区域的内存方法区时逻辑上是堆的一个组成部分,但是在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metaspace)(注意:方法区时一种规范,而永久代和元空间是它的一种实现方式)方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:(java.lang.Ou转载 2021-01-11 18:18:12 · 167 阅读 · 0 评论 -
JVM_03 运行时数据区[ 堆 ]
一、堆的概述堆的概述(共享|垃圾回收)①. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域②. Java堆区在JVM启动的时候即被创建,其空间大小也是确定的。是Jvm管理最大的一块内存空间③. 堆可以在物理上不连续的内存空间中,但在逻辑上是连续的④. 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)⑤. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才有被移除 (注意:一个进转载 2021-01-11 18:05:30 · 81 阅读 · 0 评论 -
JVM_03 运行时数据区 [ 虚拟机栈 ]
一、前言(栈并不是越大越好,越多可以防止出现StackOverflowError晚点出现,但是栈越大,也就代表着虚拟机栈是一定的,你的栈越大,别的栈就会小)二、 什么是 Java virtual machine?栈的概述每创建一个线程就会创建一个Java栈,每一个Java栈中都会有很多栈帧(局部变量表 | 操作数栈 | 动态链接 | 方法返回地址 | 一些附加信息) 掌握解释:(1). 虚拟机栈(Java Virtual Machine Stacks)和线程是紧密联系的,每创建一个线程时转载 2021-01-11 17:54:51 · 90 阅读 · 0 评论 -
JVM_03 运行时数据区 [ 程序计数器+本地方法栈 ]
一、 程序计数器①. 作用,是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令②. 特点:①. 是线程私有的 ②. 不会存在内存溢出③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元④. 它是唯一一个在java虚拟机规范中没有OOM的区域解释:⑤. 使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?⑥. PC寄存器为什么设定为线程私有?(为了能够准确记转载 2021-01-11 17:38:57 · 153 阅读 · 1 评论 -
JVM_02 类加载器子系统
①. 类的加载(掌握)简述类的加载过程(掌握)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载、类的链接、类的初始化这三个步骤来对类进行初始化。 如果不出现意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者初始化什么是类的加载(Loading)类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构链接(Linking)转载 2021-01-11 17:34:53 · 93 阅读 · 0 评论 -
JVM_01 总体概述
写在最前面:什么是JVM?①. JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机②. jvm是运行在操作系统之上的,与硬件没有任何关系Java的跨平台及原理①. 跨平台:由Java编写的程序可以在不同的操作系统上运行:一次编写,多处运行②. 原理:编译之后的字节码文件和平台无关,需要在不同的操作系统上安装一个对应版本的虚拟机(JVM)JVM的分类①. 类加载子系统②. 运行时数据区 [ 我们核心关注这里 的栈、堆、方法区 ]③. 执转载 2021-01-11 17:26:44 · 108 阅读 · 0 评论 -
SpringBoot项目优化和Jvm调优及VisualVM远程连接监控JVM(JMX连接)
项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。在这边有一篇比较好的文章,推荐给大家!SpringBoot项目配置Tomcat和JVM参数一、修改配置文件关于修改配置文件application.properties。SpringBoot项目详细的配置文件修改文档其中比较重要的有:server.tomcat.max-connections=0 # Maximum number of connecti原创 2020-12-24 10:43:57 · 1408 阅读 · 1 评论 -
BIO-NIO-AIO
一、同步和异步同步和异步是针对应用程序和操作系统的内核交互而言的,同步指的是用户进程触发IO操作并等待或者轮询地区查看IO操作是否就绪,而异步是值用户触发IO操作以后便开始做自己地事情,而当IO操作已经完成地时候会得到IO完成地通知。以银行取款为例:同步:自己亲自持银行卡到银行取钱(使用同步IO时,JAVA自己处理IO读写)异步:委托小弟到银行取钱,我干其他事,然后给我(使用异步IO时,J...原创 2020-04-22 20:00:05 · 307 阅读 · 0 评论 -
探究Java常量本质及三种常量池(JVM)
简介: 探究Java常量本质及三种常量池可以从他人的博文,还有一些书籍中了解到 常量是放在常量池 中,细节的内容无从得知,相信每个人都会觉得面前的东西是一个几乎完全的黑盒,总是觉得不舒服,翻阅《深入理解Java虚拟机》,会发现这本书中对常量的介绍更多地偏重于字节码文件的结构,还有在自动内存管理机制中也介绍了运行时常量池。下面换种思路来看一下Java中的常量池分为三种形态:静态常量池,字符串常量池以及运行时常量池。一、静态常量池所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不原创 2020-12-08 00:03:59 · 365 阅读 · 0 评论 -
HotSpot 垃圾收集器
HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。一、新生代垃圾收集器Serial 垃圾收集器(单线程)只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程(Stop The World)。一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收转载 2020-06-07 10:46:06 · 117 阅读 · 0 评论 -
Java垃圾回收机制(GC)
一、垃圾回收机制的意义总所周知,java不同于c/c++等语言,java具有独有的垃圾回收机制,可以有效的防止内存泄露、保证内存的有效使用,从而使得Java程序员在编写程序的时候不再需要考虑内存管理问题。这种垃圾回收机制自动化地解决了两个问题:给对象分配内存和回收分配给对象的内存。这两个问题针对的内存区域就是Java内存模型中的堆区。,二、JavaGC核心问题GC要考虑的问题很复杂,但主要包...原创 2020-04-10 22:18:33 · 560 阅读 · 0 评论 -
JVM内部体系结构
JVM(Java Virtual Machine,Java虚拟机)JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK...原创 2020-04-09 23:50:48 · 604 阅读 · 0 评论