
JVM
文章平均质量分 88
丶只有影子
不唯书 不唯上 不唯众 只唯实
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM上篇_01_JVM与Java体系结构_尚硅谷
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java虚拟机带来的跨平台型、优秀的垃圾回收期,以及可靠的即时编译器Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部作用Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令运行。每一条Java指令,Java虚拟机规范中都有原创 2022-05-31 23:54:14 · 169 阅读 · 0 评论 -
JVM上篇_02_类加载子系统_尚硅谷
类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则有ExcutionEngine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息时Class文件中常量池部门的内存映射加载:补充:加载.class文件的方式jclasslib下载地址 (也可是使用IDEA插件)https://github.co原创 2022-06-03 00:01:58 · 197 阅读 · 0 评论 -
JVM上篇_03_运行数据区概述及线程_尚硅谷
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。灰原创 2022-06-03 00:42:53 · 107 阅读 · 0 评论 -
JVM上篇_04_程序计数器_尚硅谷
JVM中的程序计数寄存器(Program Counter Register)中,Register的命令源于CPU的寄存器,寄存器存储指令的线程信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是指广义上所指的物理寄存器,获取将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中PC寄存器是对物理PC寄存器的一种抽象模拟。PC寄存器用来存储指令指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。反编译:反编译后结果原创 2022-06-03 11:50:30 · 228 阅读 · 0 评论 -
JVM上篇_05_虚拟机栈_尚硅谷
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?为什么?栈是运行时的单位,而堆是存储的单位 即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。J原创 2022-06-03 23:42:54 · 188 阅读 · 0 评论 -
JVM上篇_06_本地方法接口_尚硅谷
简单地将,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特诊并非Java所特有,很多其他的编程语言都有这一个机制,比如在C++中,你可以用extern “C"告知C++编译器去调用一个C的函数。 “A native method is a Java method is a Java method whose implementtation is provided by原创 2022-06-04 12:34:04 · 127 阅读 · 0 评论 -
JVM上篇_07_本地方法栈_尚硅谷
本地方法栈(Native Method Stack)原创 2022-06-04 13:06:36 · 153 阅读 · 0 评论 -
JVM上篇_08_堆_尚硅谷
一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆的内存大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓存去(Thread Local Alloction Buffer, TLAB)。原创 2022-06-05 21:52:05 · 204 阅读 · 0 评论 -
JVM上篇_09_方法区_尚硅谷
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于Java堆的内存空间。而到了JDK8,终于完成放弃了永久代的概念,改用与JRockit、J9一样原创 2022-06-11 11:43:52 · 188 阅读 · 0 评论 -
JVM上篇_11_直接内存_尚硅谷
## 直接内存概述- 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。- 直接内存是在Java堆外的、直接向系统申请的内存区间。- 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存- 通常,访问直接内存速度会由于Java堆,即读写性能高。 - 因为出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 - Java的NIO库允许Java程序使用直接内存,用于数据缓冲区OutOfMemoryError: Direct buffer原创 2022-06-12 14:36:33 · 244 阅读 · 0 评论 -
JVM上篇_12_执行引擎_尚硅谷
所属位置 JVM主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码执行并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信心。 那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM的执行引擎充当了将高级语言翻译为机器语言的译者。(1)执行引擎在执行过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器原创 2022-06-13 00:49:24 · 261 阅读 · 0 评论 -
JVM上篇_13_StringTable_尚硅谷
官方文档:https://openjdk.java.net/jeps/254The current implementation of the class stores characters in a array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component of原创 2022-06-25 17:49:51 · 256 阅读 · 0 评论 -
JVM上篇_10_对象的实例化内存布局与访问定位_尚硅谷
美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:java对象头里有什么?判断对象对应的类是否加载、链接、初始化前面所述是从字节码角度看待对象的创建过程,现在从执行步骤的角度来分析:为对象分配内存:首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小指针碰撞如果内存是规整的,那么虚拟机将采用的是指针碰撞发(Bump The Pointer)来为对象分配内存。意思是所有用过的内存在一边,空闲的内存在另一边,中间放着一个原创 2022-06-11 23:25:42 · 124 阅读 · 0 评论 -
JVM上篇_14_垃圾回收概述_尚硅谷
蚂蚁金服你知道哪几种垃圾回收期,各自的优缺点,重点将一下cms和g1一面:JVM GC算法有哪些,目前的JDK版本采用什么回收这算法一面:G1回收器讲下回收过程GC是什么?为什么要有GC?一面:GC的两种判定方法?CMS收集器与GC收集器的特点。百度说一下GC算法,分代回收说下垃圾收集策略和算法天猫一面:jvm GC原理,JVM怎么回收内存一面:CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么?滴滴一面:java的垃圾回收期都有哪些,说下g1的应用场景,平时你是如何搭配使用垃圾回收期的京东原创 2022-06-25 17:50:38 · 201 阅读 · 0 评论 -
JVM上篇_15-垃圾回收相关算法_尚硅谷
注意,这些只是最基本的算法思路,实际GC实现过程要复杂的多,目前还在发展中的前沿GC都是复合算法,并且并行和并发兼备。原创 2022-09-12 22:19:28 · 272 阅读 · 0 评论 -
JVM上篇_16_垃圾回收相关概念_尚硅谷
对于老版本的Oracle JDK,因为永久代的大小是有限的,并且JVMU对永久代垃圾回收(如,常量池回收、写在不再需要的类型)非常不积极,所以当我们不断添加新类型的时候,永久代出现OutOfMemoryError也非常多见,尤其是运行时存在大量动态类型生成的场合;弱引用和软引用一样,在构造弱引用时,也可以指定一个引用队列,当弱引用对象被回收时,就会加入指定的引用队列,通过这个队列可以追踪对象的回收情况。如果一个对象仅持有虚引用,那么它和没有引用几乎是一样的,随时都可能被垃圾回收器回收。原创 2022-09-12 22:20:02 · 225 阅读 · 0 评论 -
JVM上篇_17_垃圾回收器_尚硅谷
垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型API层面:Stream API、新的日期时间、Optional、String、集合框架底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池等。原创 2022-09-18 17:47:03 · 1728 阅读 · 0 评论 -
JVM下篇:性能监控与调优篇_01_概述篇_尚硅谷
- 生产环境发生了内存溢出该如何处理?- 生产环境应该给服务器分配多少内存合适?- 如何对垃圾回收器的性能进行调优?- 生产环境CPU负载飚高该如何处理?- 生产环境应该给应用分配多少线程合适?- 不加log,如何确定请求是否执行了某一行代码?- 不加log,如何实时查看某个方法的入参与返回值?原创 2022-09-28 00:09:12 · 367 阅读 · 0 评论 -
JVM下篇:性能监控与调优篇_02_JVM监控及诊断工具-命令行篇_尚硅谷
性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明,使用知识分析问题,使用工具处理问题。体会2:无监控、不调优!原创 2022-10-03 14:19:31 · 1362 阅读 · 0 评论 -
JVM下篇:性能监控与调优篇_03_JVM监控及诊断工具-GUI篇_尚硅谷
无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。要求用户登录到目标Java应用所在的宿主机上,使用起来不是很方便。分析数据通过终端数据,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。图形化综合诊断工具JDK自带工具jconsole:JDK自带的可视化监控工具。原创 2022-10-16 00:28:29 · 2475 阅读 · 0 评论 -
JVM下篇:性能监控与调优篇_04_JVM运行时参数_尚硅谷
只有显式使用Eden区和Survivor区的比例,才会让比例生效,否则比例都会自动设置,至于其中的原因,请看下面的-XX:+UseAdaptiveSizePolicy中的解释,最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy设置,并且不显示设置-XX:SurvivorRatio。没有显示使用Eden区和Survivor区的比例,无论打开或者关闭-XX:+UseAdaptiveSizePolicy,都会自动设置Eden区和Survivor区的比例。设置年轻代并行收集器的线程数。原创 2022-10-16 15:16:23 · 1328 阅读 · 0 评论 -
JVM下篇:性能监控与调优篇_05_分析GC日志_尚硅谷
在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC前堆内存已使用容量->GC后堆内存容量(堆内存总容量),并且堆内存总容量 = 9/10 新生代 + 老年代,然后堆内存总容量肯定小于初始化的内存大小。在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC前堆内存已使用容量->GC后堆内存容量(堆内存总容量),并且堆内存总容量 = 9/10 新生代 + 老年代,然后堆内存总容量肯定小于初始化的内存大小。发生了一次垃圾回收,这是一次Minior GC。原创 2022-10-16 15:17:24 · 504 阅读 · 0 评论 -
JDK工具之jps详解
JDK(Java Development Kit)是 Java 开发人员必备的工具包,其中包含了许多强大的命令行工具,用于开发、调试和监控 Java 应用程序。其中,jps(Java Virtual Machine Process Status Tool)是一个简单但十分有用的命令行工具,用于查看当前运行的 Java 进程以及它们的相关信息。在本文中,我们将详细了解jps命令及其用法。jps命令用于列出当前系统中正在运行的 Java 进程(Java 虚拟机进程)。原创 2023-07-26 23:38:05 · 5563 阅读 · 0 评论