图文剖析JVM的运行时数据区

jvm中指定时区信息user.timezone 同一份程序使用时间LocalDateTime类型,在国内和国外部署后,返回的时间信息前端使用出问题。因为LocalDateTime不带时区信息,国内调用后,前端页面默认使用的浏览器所在os的时区(我们的系统中没有给用户设置时区), 因此会出现时间不一致, 或者判断超时了,但是实际上没有超时的问题。 阅读详情

1.走近JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,运行Java字节码。符合Java语言规范的编程语言(比如Scala、Kotlin、Groovy,会编译成Java字节码),都可以运行在JVM上。

JVM是一个虚构出来的计算机,在实际的计算机上仿真模拟各种计算机功能。JVM有自己架构,处理器、堆栈等,还有相应的指令系统。

JVM本质上是一个应用程序,在不同的操作系统平台有不同的实现,但是都可以支持字节码文件(.class)运行。

Java所谓的“一次编译,多次运行”就是基于JVM实现的。跨平台也是这个意思,对于不同平台的差异,由JVM解决。这是一个很好的跨平台设计。

JVM还有一点,就是自动内存管理,这是不同于C++的重要的一点。

Java语言规范(The Java Language Specification)1,可以理解为一个模板蓝图,有很多条款。符合Java语言规范的编程语言,都可以编译生成字节码,运行在JVM上。

常见的:Scala、Kotlin、Groovy、JRuby、Jython/JPython。

你本事大的话,熟读Java语言规范,可以实现自己的语言。

Java虚拟机规范(Java Virtual Machine Specification)2,规定了实现JVM的框架。符合Java虚拟机规范的虚拟机,都可以运行字节码。常见的JVM有:HotSpot、IBM J9 VM、Graal VM等等。

你本事大的话,熟读JVM规范,可以实现自己的JVM。

2.走进JVM的运行时数据区3

Java程序员,借助JVM的自动内存管理机制,高效的开发应用程序,也不用过于担心内存泄漏和内存溢出的问题。如果不了解JVM如何使用内存,那排查问题寸步难行。

JVM规范,规定了运行时数据区域,有明确的划分。各自区域有自己的作用,互相协同,配合,为数以亿计的应用程序提供服务支持。

直接上图,清晰明了的展示。我们主要探讨的是运行时数据区域。

JVM结构

2.1.程序计数器

2.1.1.简述

程序计数器(Program Counter Register,官文为The Register pc)是一块比较小的内存空间,当前线程执行的字节码的行号指示器。每个线程都有自己的程序计数器(叫PC寄存器/寄存器也可以),字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令。

它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。

  1. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;
  2. 如果正在执行的是本地(Native)方法,这个计数器值则应为未定义(Undefined)。
2.1.2.概要总结
主要作用线程安全异常常见配置生命周期
记录当前线程执行的字节码的行号私有,线程安全没有任何异常同线程

2.2.Java虚拟机堆栈

2.2.1.简述

Java虚拟机堆栈(Java Virtual Machine Stacks,第一版JVM规范称其为Java堆栈,英文是Java Stacks)是Java方法执行的线程内存模型:每个方法被调用的时候,就会创建一个栈帧(Stack Frame)。

每个线程都有自己的堆栈,同线程一同创建,生命周期和线程的生命周期一致。

JVM堆栈不要求内存连续。只有出栈和入栈两个操作。

  1. 线程中每一次方法调用,就有一个对应的栈帧被压入JVM堆栈。
  2. 每一个方法调用结束(return或抛异常),就有一个栈帧被弹出Java堆栈。

栈帧存储了局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直到执行完毕的过程,就对应一个栈帧在虚拟机堆栈入栈和出栈的过程。

Java虚拟机堆栈的数据结构大概如下:

栈:先进后出(FILO—First-In/Last-Out) ,有底有两壁没有盖子,像个水杯。

JVM-栈

JVM堆栈有两类异常:

  1. 如果线程请求的栈深度大于虚 拟机所允许的深度,将抛出StackOverflowError异常;
  2. 如果Java虚拟机堆栈容量可以扩展,当扩展的时候无法申请到足够的内存会抛出OutOfMemoryError异常。
2.2.2.概要总结
主要作用线程安全异常常见配置生命周期
Java方法执行的线程内存模型私有,线程安全StackOverflowError
OutOfMemoryError
线程栈大小 -Xss同线程

2.3.本地方法栈

2.3.1.简述

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。

HotSpot将Java虚拟机堆栈和本地方法栈合二为一。

2.3.2.概要总结
主要作用线程安全异常常见配置生命周期
Java方法执行的线程内存模型私有,线程安全StackOverflowError
OutOfMemoryError
线程栈大小
-Xoss(HotSpot不起作用)
同线程

2.4.Java堆

2.4.1.简述

堆(Heap),是虚拟机所管理的内存中最大的一块,与Java应用程序关系最为密切,也是程序员需要重点关注的区域。堆是线程共享的。

堆是分配所有类实例(对象)和数组的内存运行时数据区域,几乎所有的对象都存放在堆中。
字符串常量池,也在堆中。(JDK8之前在方法区)

2.4.1.1.对象都在Java堆上分配吗?

这问题的上一句其实就是答案。前半句来自JVM官文,后半句来自一本书。书上的原话在下面

由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手短已经导致一些微妙的变化悄然发生,所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。

——《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》周志明

官文的原文如下,几个LTS版本都行这句话。LTS不了解的话,可以参考我的博文JDK的两个大版本,为什么要选LTS_编程还未的博客-优快云博客

The heap is the run-time data area from which memory for all class instances and arrays is allocated.

——JVM官文8,11,17

堆是为所有类实例和数组分配内存的运行时数据区域。

——Google翻译

官文是all class,书上是几乎。为什么会有一点差异呢。我的个人理解是这样的:

JVM官文规定的是JVM规范,没提到即时编译技术(JIT),没规定必须用。HotSpot作为基于JVM规范实现的虚拟机使用了JIT,以提高性能。JVM官文的大目录没看到即时编译相关的词语,我会继续读文档,如果有新发现会在这里修正。

——编程还未

所以,我的答案是分两种情况:

  1. JVM官方规范规定所有的对象和数组在堆分配。为了避免面试官把问题引导即时编译,就不要提了。
  2. 如果熟悉即时编译的话,那就是:虽然JVM官文规定所有对象和数组在堆分配,但是随着即时编译技术的提升……。然后要么被面试官问懵掉,要么面试官懵掉。

堆是在虚拟机启动时创建的。堆的内存由垃圾回收系统自动管理,也就是垃圾会搜器(Garbage Collector)。从垃圾回收内存的角度来看,现代垃圾回收器大部分基于分代收集理论设计。我们基于HotSpot来分析。

JVM-堆

上图就是HotSpot中常见的堆内存划分。

堆包含老年代和新生代,默认比例为2:1。新生代包含eden区(伊甸区)、from survivor区(s0)和to survivor区(s1),默认比例为8:1:1。

在绝大多数情况下,对象首先分配在eden区(伊甸园,出生地),在一次新生代回收后,还存活的对象会进入到s0区或s1区。s0和s1区也叫from区和to区,这是两块大小一样可以互换的内存空间。survivor是幸存的意思。

进到s0或s1之后,每经过一次新生代回收(Minor GC),对象如果存活,它的年龄会+1。当对象的年龄到达一定条件(默认15岁),就会进入老年代。老年代空间不足的时候会出发老年代回收(Major GC或叫做Full GC)。

堆在物理空间上不一定连续,在逻辑上是被要求连续的。所有线程共享堆,但是可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。

Java堆可以被实现成固定大小,也可以扩展大小。目前主流的虚拟机都可以扩展大小,以HotSpot为例,配置参数为-Xms(初始值)和-Xmx(最大值)。一般初始值和最大值设置为一样。因为堆内存占用从初始值涨到最大值,需要内存分配,耗费CPU资源。如果堆中没有足够的空间分配内存,Java虚拟机就会抛出OutOfMemmoryError异常。

2.4.2.概要总结
主要作用线程安全异常常见配置生命周期
存放对象实例和数组所有线程共享,线程不安全OutOfMemoryError1.新生代大小 -Xmn
2.堆初始值 -Xms
3.堆最大值 -Xmx
4.Eden区和from/to区
的比例 -XX:SurvivorRatio
同虚拟机

2.5.方法区

2.5.1.简述

方法区(Method Area)用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据(存储类的元数据)。方法区同Java堆一样,是所有线程共享的。

方法区中最重要的是类型信息、常量池、域信息、方法信息。

  1. 类型信息包括类的完整名称、父类的完整名称、类型修饰符(public、protected、private)和类型的直接接口列表。
  2. 常量池包括类方法、域等信息所引用的常量信息。
  3. 域信息包括域名称、域类型和域修饰符。
  4. 方法信息包括方法名称、返回类型、方法参数、方法修饰符、方法字节码、操作数栈和方法栈帧的局部变量区大小及异常表。

方法区是在虚拟机启动时创建的。方法区在逻辑上的堆的一部分,但是可以选择不进行垃圾回收或压缩。

在HotSpot虚拟机中,实现方法区的是永久代(Permanent Generation)。这里的关系是这样的,JVM规范规定虚拟机要有方法区(Method Area),但是限制的内容不是很多。HotSpot团队把垃圾回收器的分代设计扩展到方法区,这样就可用像管理Java堆一样管理这部分内存。HotSpot用的实现就是永久代。其他虚拟机并没有永久代。实现方法区属于虚拟机实现细节,不受JVM规范管束,并不要求统一。

方法区并不是一个优秀的设计,所以Java8开始废弃了方法区,用元空间(Meta-Space)代替。方法区如果无法满足新的内存分配时,会抛出OutOfMemoryError人异常。

2.5.1.1.运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。每个类文件(Class文件)中,都定义了一组数据结构来表示类或接口运行时的表示形式,这就是运行时常量池。

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

类或接口的运行时常量池是在 Java 虚拟机创建类或接口时构造的。如果没有足够的内存用来分配,则会抛出OutOfMemoryError异常。

每个Class文件中都有一个常量池表,在编译的时候生成,字节码里面可以看到。类或接口的二进制表示形式(字节码)中的常量池表用于在创建类或接口时构造运行时常量池。

这里的关系是这样的:常量池表(Constant Pool Table)在Class文件中,每个类都有一个;运行时常量池(Runtime Constant Pool)是方法区的一部分,JVM启动的时候在内存中逻辑划分;常量池表用于创建类或接口时构造运行时常量池。

运行时常量池中所有的引用最初都是符号引用。这些符号是按以下方式,从类或接口的二进制表示形式(字节码)中得到:以下CONSTANT的结构,都来自类或接口的的二进制表示(字节码)。

  • 类或接口的符号引用来自CONSTANT_Class_info结构。这种引用提供的类和接口名称,的格式和Class.getName()方法返回的一样 。
  • 类或接口的属性的符号引用来自CONSTANT_Fieldref_info结构。这种引用包含了属性的名称和描述符,以及指向属性所属类或接口的符号引用。
  • 类的方法符号引用来自CONSTANT_Methodref_info结构。这种引用包含了方法的名称和描述符,以及指向方法所属类的符号引用。
  • 接口的方法符号引用来自CONSTANT_InterfaceMethodref_info结构。这种引用包含了方法的名词和描述符,以及指向方法所属接口的符号引用。
  • 方法句柄的符号引用来自CONSTANT_MethodHandle_info结构。这种引用给出了方法描述符,具体取决于方法句柄的类型。
  • 方法类型的符号引用来自CONSTANT_MethodType_info。这种引用该处了方法描述。
  • 动态计算的常数符号引用来自CONSTANT_Dynamic_info。
  • 调用点限定符的符号引用来自CONSTANT_InvokeDynamic_info。
  • 字符串常量是指向String类实例的引用,来自CONSTANT_String_info结构。

Java语言规定,相同的字符串常量必须指向同一个String实例。**4

下面两项是正确的:

  1. 如果以前在包含与结构给定的相同的 Unicode 码位序列的类实例上调用了该方法,则字符串常量是同一类实例的一个。
  2. 否则,将创建一个新的类实例,其中包含结构给出的 Unicode 码位序列。字符串常量获取的结果是指向那个新String实例的引用。最后,新String实例的intern方法被虚拟机自动调用。

原文如下:
5.1. The Run-Time Constant Pool

  • A string constant is a reference to an instance of class String, and is derived from a CONSTANT_String_info structure. To derive a string constant, the Java Virtual Machine examines the sequence of code points given by the CONSTANT_String_info structure:
    • If the method String.intern has previously been invoked on an instance of class String containing a sequence of Unicode code points identical to that given by the CONSTANT_String_info structure, then the string constant is a reference to that same instance of class String.
    • Otherwise, a new instance of class String is created containing the sequence of Unicode code points given by the CONSTANT_String_info structure. The string constant is a reference to the new instance. Finally, the method String.intern is invoked on the new instance.

关于字符串的内容,可以参考我这篇博文String的特性详解-用源码、字节码和内存示意图详解,官文提供论点支撑_编程还未的博客-优快云博客

2.5.2.概要总结
主要作用线程安全异常常见配置生命周期
存放类的结构
(类的元数据)
所有线程共享,线程不安全OutOfMemoryErrorHotSpot1.7及之前
1.永久代大小 -XX:PermSize
2.永久代上限 -XX:MaxPermSize
HotSpot1.8及之后
1.元空间大小-XX:MetaspaceSize
2.元空间上限-XX:MaxMetaspaceSize
同虚拟机

2.6.直接内存

直接内存(Direct Memory)并不是JVM运行时数据区的一部分。JVM规范中也没有规定直接内存。直接内存被频繁使用,也会发生OutOfMemoryError异常。

这部分资料比较少,直接引用一下

在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区 (Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的 DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了 在Java堆和Native堆中来回复制数据。

显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到 本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务 器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使得 各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现 OutOfMemoryError异常。

——《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》周志明


  1. Java11语言规范 ↩︎

  2. Java11JVM规范 ↩︎

  3. 参考资料:Java11JVM规范、《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》周志明、《实战JAVA虚拟机 JVM故障诊断与性能优化》葛一鸣、《深入理解 JVM&G1 GC》周明耀、《HotSpot实战》陈涛 ↩︎

  4. ​ String Literals ↩︎

ArcGIS标注太乱?手把手教你用‘要素分类标注’搞定河流分级显示 本文详细介绍了如何在ArcGIS Pro中使用要素分类标注功能实现河流分级显示,解决标注混乱问题。通过数据预处理、分类标注规则定义和高级参数调优,帮助用户打造层次分明、专业清晰的水系地图,提升地图信息传达效率。 阅读详情

相关推荐

9 海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例

海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 7166

如何设置 JVM 时区

如何设置 JVM 时区

Jaemon 1万+

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

java 虚拟机 时区_关于jvm运行时时区的总结

一:运行时数据区1.这当中线程 共享和线程私有:01.线程共享:堆, 方法区02.线程私有虚拟机栈,本地方法栈,程序计数器程序计数器:在计算机操作系统中程序计数器表示这个程序要执行的下一个指令的地址,对于JVM中的程序计数器可以看做是当前线程所执行的字节码的行号指示器,每个线程都有一个程序计数器(当线程都在执行的时候,如果线程要切换将要保证线程回归到正确的位置),重要的一点——程序计数器,这是JV...

weixin_28759829的博客 419

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8780

医学影像分割入门:为什么U-Net至今仍是肝脏CT肿瘤分割的‘首选’?

本文探讨了U-Net在肝脏CT肿瘤分割中的持久优势,分析了其轻量化设计、对称架构和跳跃连接如何完美适配医学影像的小样本、高精度需求。通过对比实验和实战建议,揭示了U-Net在肝脏肿瘤分割任务中超越新模型的根本原因,并提供了PyTorch实现和部署技巧。

weixin_38166931的博客 518

Jvm中时区设置方式

这篇文章memo一下Jvm和Mysql中关于时区设定的基础操作。 Java的时区设定 这里列出如下三种方式 方式 说明 TimeZone.setDefault方式 通过java的utils下的TimeZone进行动态设定 user.timezone传递方式 运行时通过传递-Duser.timezone=xxx进行设定 TZ环境变量方式 ...

知行合一 止于至善 2万+

零基础学simulink仿真建模--基于Simulink进行农业机械用开关磁阻电机的仿真建模

特点结构简单:无电刷、换向器等易损件,维护成本低。坚固耐用:适合恶劣的工作环境,如农业机械作业现场。宽调速范围:通过适当的控制策略可以实现较宽的速度调节范围。挑战非线性特性:SRM的电磁特性和转矩特性具有高度非线性。复杂性:涉及电气、机械动力学以及控制系统的设计与集成。实时性要求:需要快速响应以适应不断变化的操作条件。多变量优化:包括电流控制、速度控制等多个方面需综合考虑。使用Simscape Electrical库来构建一个开关磁阻电机模型。

amy_mhd的博客 909

java 虚拟机 时区_详解Jvm中时区设置方式

这篇文章memo一下Jvm中关于时区设定的基础操作。Java的时区设定这里列出如下三种方式方式说明TimeZone.setDefault方式通过java的utils下的TimeZone进行动态设定user.timezone传递方式运行时通过传递-Duser.timezone=xxx进行设定TZ环境变量方式通过export的TZ环境变量进行设定TimeZone.setDefault方式Sample代...

weixin_30768979的博客 1026

PDAF相位对焦原理

pdaf光路图

camerall 1万+

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 866

深入理解Java虚拟机——运行时数据区和本地方法接口——详细篇——第三章

前言 我们学习Java的第一天开始,老师就告诉我们Java语言相比较其他语言,他有一个非常强大的地方就是内存管理,我们使用Java不需要申请内存,释放内存,这一切工作都由Java虚拟机来完成。 文章目录1:Java虚拟机内存管理1.1 程序计数器1.2 Java虚拟机栈1.3 本地方法栈1.4 Java堆内存1.5 方法区2:对象在内存中的布局2.1 对象的创建2.2 给对象分配内存2.3 线程安...

qq_44891295的博客 2028

使用MATLAB/Simulink搭建一个简化的无人机螺旋桨气动特性模型,并通过仿真验证其基本功能

螺旋桨概述特点:螺旋桨通过旋转产生推力,推动无人机前进或上升。关键参数直径(D):影响推力和功率消耗。螺距(P):定义了螺旋桨每转一圈理论上前进的距离。效率(η):衡量螺旋桨将机械能转化为推力的有效性。应用场景:航拍摄影、农业监测、物流配送等。仿真目标搭建一个简化的无人机螺旋桨气动特性模型,涵盖从电机输入到螺旋桨输出推力的过程。分析不同条件下的系统响应特性(如推力、功率消耗),并探讨优化螺旋桨设计的方法。定义螺旋桨的一些基本物理参数,如直径、螺距、推力系数、功率系数等。使用Constant。

xiaoheshang_123的博客 428

java运行原理_Java基础—Java运行原理

Java程序运行原理详解 本文详细介绍了Java程序从编写到执行的完整流程。Java采用"先编译后解释"的混合执行方式,通过JVM实现跨平台特性。程序首先被编译为.class字节码文件,然后由JVM加载执行。JVM内部包含三大核心模块:类加载子系统负责加载.class文件,运行时数据区管理内存分配,执行引擎解释执行字节码。文章特别强调了JVM内存结构,包括线程共享的方法区和堆,以及线程私有的虚拟机栈、本地方法栈和程序计数器。理解这些底层原理对Java开发者至关重要,无论是准备面试还是深入

likuoelie的博客 756

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM之内存结构详解

对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。 我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们的第一篇文章《JVM之内存结构详解》。 学习也是要讲究方式方法...

程序新视界 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JVM之内存结构图文详解

点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们...

程序猿DD 1305

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

视频教程-挑战高薪-JVM深入详解-Java

挑战高薪-JVM深入详解 从事软件工程行业近7年。曾就职于“丹麦外资诺和诺德...

weixin_34556747的博客 226

java 暂停_关于Java虚拟机的22个重难点【干货】

Java虚拟机一直是比较重要的知识点,是Java高级开发必会的。本文为你总结了关于JVM的22个重点、难点,图文并茂的向你展示和JVM有关的重点知识。概念虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)。Java虚拟...

weixin_39661881的博客 137

JVM底层原理最全解析!

当你工作多年之后,你遇到的项目会越来越复杂,遇到的问题也会越来越复杂:各种古怪的内存溢出,死锁,应用崩溃……这些都会迫使你不得不去深入学习JVM底层原理

Javatutouhouduan的博客 25

JVM之垃圾收集算法

前言 上篇文章已经给大家介绍了 JVM 的架构和运行时数据区 (内存区域),本篇文章将给大家介绍 JVM 的重点内容——垃圾收集。众所周知,相比 C / C++ 等语言,Java 可以省去手动管理内存的繁琐操作,很大程度上解放了 Java 程序员的生产力,而这正是得益于 JVM 的垃圾收集机制和内存分配策略。我们平时写程序时并感知不到这一点,但是如果是在生产环境中,JVM 的不同配置对于服务器性能的影响是非常大的,所以掌握 JVM 调优是高级 Java 工程师的必备技能。正所谓“基础不牢,地动山摇”,在这

猎户星座 134

jvm内存结构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

qq_38325803的博客 166

JVM核心考案2 | 系统性学习 | 无知的我费曼笔记(图文排版无水印)

无知的我正在复盘JVM。。。 笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己更容易理解的描述。。 提升了总结归纳性 同样是回答了一些常见关键问题。。 文章目录JVM-是什么JVM-跨平台跨语言JVM-运行时数据区JVM-堆空间JVM-内存溢出示例JVM-内存泄露JVM-对象头JVM-常用JVM启动参数JVM-设置堆空间的最大值要考虑的JVM-排查OOM的手段JVM-Java8中默认使用的垃圾收集器JVM-并行垃圾收集JVM-安全点JVM-排查CPU突然飙升JVM-类加载JVM-G1收集器

无知的人博客 604

Java的JVM揭秘

版权声明:本文转载,源主文章版权遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/wo541075754/article/details/102623406 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列...

ccpit2b2c的专栏 172

JVM 面试题

jvm面试题

qq_48621751的博客 276
上一篇: JDK的两个大版本,为什么要选LTS
下一篇: JDK诊断工具——jps
编程还未
博客等级 码龄5年 4293粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程还未

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值