JVM
文章平均质量分 86
Java Virtual Machine(Java虚拟机)
洒家肉山大魔王
学习是一辈子的事情,去身上的戾气也是一辈子的修炼。
展开
-
Java的jmap命令使用详解
jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。jmap命令和jinfo命令一样,在Windows系统上使用还是有一些限制的。原创 2024-04-10 14:12:03 · 1275 阅读 · 0 评论 -
快速解读GC日志
其中一次清理的是年轻代(Young generation), 而第二次处理的是整个堆内存。通过上面的分析, 我们可以计算出在垃圾收集期间, JVM 中的内存使用情况。文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。(559,231k), 但总的堆内存使用(total heap usage)只减少了。右边)中蕴含了更重要的结论, 年轻代的内存使用在垃圾回收后下降了。(213,132K) 的年轻代对象被提升到老年代(Old)中。(629,119k)。原创 2023-06-04 14:57:07 · 784 阅读 · 0 评论 -
GC 调优(实战篇)
JVM上运行的程序多种多样, 启动参数也有上百个, 其中有很多会影响到 GC, 所以调优GC性能的方法也有很多种。还是那句话, 没有真正的银弹, 能满足所有的性能调优指标。我们能做的只是介绍一些常见的/和不常见的示例, 让你在碰到类似问题时知道是怎么回事。深入理解GC的工作原理, 熟练应用各种工具, 就可以进行GC调优, 提高程序性能。原创 2023-06-04 14:53:10 · 658 阅读 · 0 评论 -
GC 调优(工具篇)
进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具。JVM 在程序执行的过程中, 提供了GC行为的原生数据。那么, 我们就可以利用这些原生数据来生成各种报告。原生数据(raw data可以通过这些数据算出各种指标, 例如: 程序的内存分配率, 提升率等等。本章主要介绍如何获取原生数据。后续的章节将对重要的派生指标(derived metrics)展开讨论, 并引入GC性能相关的话题。原创 2023-06-04 14:52:40 · 529 阅读 · 0 评论 -
GC 调优(基础篇)
GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理。初学者可能会被 200 多个 GC参数弄得一头雾水, 然后随便调整几个来试试结果,又或者修改几行代码来测试。第一步, 我们需要做的事情就是: 制定明确的GC性能指标。我们先讲解基本概念,然后再演示如何使用这些指标。如果您对 延迟、吞吐量和系统容量等概念很熟悉, 可以跳过这一小节。原创 2023-06-04 14:34:21 · 634 阅读 · 0 评论 -
G1(Garbage First)垃圾收集器的一些配置参数
下表为 G1 GC垃圾收集器的一些配置参数:原创 2023-05-08 21:28:23 · 607 阅读 · 0 评论 -
Java Hotspot G1 GC的一些关键技术
G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。转载 2023-05-08 21:21:28 · 142 阅读 · 0 评论 -
JDK 监控和故障处理工具总结
VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随 JDK 发布的功能最强大的运行监视和故障处理程序,官方在 VisualVM 的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析(Profiling)。生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。:输出对应名称的参数的具体值。原创 2022-10-01 14:10:32 · 177 阅读 · 0 评论 -
图解Java对象在Heap内存中的分配和回收过程
为新对象分配内存是一个非常严谨和复杂的任务。JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配空间算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收是否会在内存空间中产生内存碎片。原创 2022-09-14 19:55:37 · 462 阅读 · 0 评论 -
JAVA类文件结构详解
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。Clojure(Lisp 语言的一种方言)、Groovy、Scala 等语言都是运行在 Java 虚拟机之上。原创 2022-09-07 12:08:35 · 1014 阅读 · 0 评论 -
The JVM could not be started. The maximum heap size (-Xmx) might be too large or an antivirus or fir
启动XXXX.exe执行程序时报错:The JVM could not be started. The maximum heap size (-Xmx) might be too large or an antivirus or firewall tool could block the execution.启动参数(-Xmx)配置过大,超过了系统最大可用资源。原创 2022-09-06 21:34:13 · 2719 阅读 · 3 评论 -
JVM垃圾回收的空间分配担保原则
空间分配担保目的:在年轻代进行Minor GC前,老年代本身应该还有容纳新生代所有对象的剩余空间。如果不够,则进行Full GC。-XX:HandlePromotionFailure: 是否设置空间分配担保原创 2022-01-26 22:08:44 · 744 阅读 · 0 评论 -
Class的forName(“java.lang.String”)和Class的getClassLoader()的Loadclass(“java.lang.String”)的区别
1. 类加载的方式主要有两种:隐式加载:使用 new + 构造方法时,隐式的调用类加载器,加载对应的类到 JVM 中,是最常见的类加载方式。 显式加载:使用 loadClass()、forName() 等方法显式的加载需要的类,对于显式加载这种类加载方式来讲,当我们获取到了 Class 对象后,需要调用 Class 对象的 newInstance() 方法来生成对象的实例。两种类加载方式的区别:隐式加载能够直接获取对象的实例,而显式加载需要调用 Class 对象的 newInstance()原创 2021-11-09 22:27:22 · 855 阅读 · 1 评论 -
JVM的常用参数总结
JVM的参数非常之多,这里只列举比较重要的几个,通过各种各样的搜索引擎也可以得知这些信息。原创 2021-11-08 19:45:51 · 91 阅读 · 0 评论 -
Java虚拟机中的堆(Heap)
前言一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。它是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)《Java虚拟机规范》中对Java堆的描述:所有的对象实例以及数组都原创 2021-11-08 19:40:02 · 2070 阅读 · 0 评论 -
Java虚拟机栈
1. 虚拟机栈概述1.1. 虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。1.2. 初步印象有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?为什么?1.3. 内存中的栈与堆栈是运行时的单位,而堆是存储的单位栈解决程序的运行问原创 2021-11-08 12:51:07 · 407 阅读 · 0 评论 -
JVM GC参数以及GC算法的应用
本节主要总结GC的算法在JVM中的不同应用。1. Serial(串行)收集器串行收集器是最古老,最稳定以及效率高的收集器可能会产生较长的停顿,只使用一个线程去回收-XX:+UseSerialGC新生代、老年代使用串行回收 新生代复制算法 老年代标记-压缩串行收集器的日志输出:0.844: [GC 0.844: [DefNew: 17472K->2176K(19648K), 0.0188339 secs] 17472K->2375K(63360K), 0.018原创 2021-10-24 10:47:01 · 183 阅读 · 0 评论 -
JVM中的经典垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器。我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。1. Seria收集器Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了。大原创 2021-10-24 10:24:16 · 162 阅读 · 0 评论 -
Java对象引用之“强引用、软引用、弱引用、虚引用”
无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可达,判定对象是否存活都和“引用”离不开关系。Java对引用的概念分为4类,各自引用强度依次减弱,分类如下:强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)1.强引用强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Objectobj=new O.原创 2021-10-18 21:23:01 · 493 阅读 · 0 评论 -
JVM中的GC算法总结
从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。本节主要总结的垃圾回收算法均属于追踪式垃圾收集的范畴。1.分代收集算法这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批原创 2021-10-17 21:21:54 · 230 阅读 · 0 评论 -
HotSpot虚拟机对象揭秘
chu通过前一节《Java内存区域(运行时数据区)》大概知道了虚拟机的内存情况。本节内容将总结一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。1.对象的创建下图是 Java 对象的创建过程,建议最好是能默写出来,并且要掌握每一步在做什么。Step1:类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程..原创 2021-10-17 15:48:46 · 201 阅读 · 0 评论 -
Java内存区域(运行时数据区)
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。1. 运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。Java内存运行区域.原创 2021-10-14 20:53:26 · 415 阅读 · 0 评论 -
Java类的加载机制
概述在开始正文之前,我们先看两张图 。Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图再看一下jvm的大致物理结构图本文主要内容:什么是类加载? 类的加载过程(生命周期)? 类什么时候初始化? 类初始化顺序? 类加载器、反射、字节码等一系列问题。一、类加载机制概念Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机.原创 2021-08-21 13:00:56 · 3062 阅读 · 0 评论 -
Java虚拟机(JVM)初探
1. JVM的概念JVM是Java Virtual Machine的简称,意为Java虚拟机,用于运行Java字节码的虚拟机。虚拟机:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。有哪些虚拟机 VMWare Visual Box JVMVMWare或者Visual Box都是使用软件模拟物理CPU的指令集JVM使用软件模拟Java 字节码的指令集JVM发展历史JVM种类Java语言规范JVM规范...原创 2021-08-11 12:01:38 · 225 阅读 · 0 评论 -
Java虚拟机类加载器--双亲委派模型
1. 双亲委派模型是什么?当某个类加载器需要加载某个.class字节码文件时,它首先把这个任务委托给它的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。2. 双亲委派模型的工作原理?【1】如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去执行;【2】如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;(每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最原创 2021-08-01 16:42:07 · 267 阅读 · 0 评论 -
Java虚拟机类加载机制--类加载器详解
1.Java类加载器的分类 JVM的类加载是通过ClassLoader相关类加载器来完成的,类的层次关系和加载顺序可以由下图来描述:常见的类加载器:【1】BootstrapClassLoader(启动类/引导类加载器)这个类加载器使用C/C++语言实现的,嵌套在JVM内部。 负责Java核心类的加载,用来加载(JAVA_HOME/jre/lib/rt.jar里所有的class,加载resources.har、或者System.getProperty(“sun.boot.class.pat原创 2021-07-31 18:40:04 · 377 阅读 · 0 评论 -
Java虚拟机类加载机制--类加载的过程详解
1.类的加载首先,我们需要了解下什么是类的加载过程。一个java类文件被Java虚拟机从编译到执行,包括两个过程:编译、运行。编译,即我们编译好的java类文件,通过javac命令编译成.class的字节码文件运行,即将编译好的字节码文件交由Java虚拟机JVM来执行。由此,类加载过程指Java虚拟机把.class的字节码文件中类信息加载进内存,并进行解析生成对应的class对象的过程。即,JVM在执行某段代码时,遇到了class A, 然而此时内存中并没有class A的相关信原创 2021-07-31 18:38:42 · 1428 阅读 · 0 评论