Java转行之路—《深入理解JAVA虚拟机总结》(一)

简介: JVM运行时数据区

Java转行之路—《深入理解JAVA虚拟机总结》(一)

Java虚拟机运行时数据区

程序计数器(Program Counter Register)

(1)Little Space
(2)当前所执行字节码的行号指示器
(3)每条线程都有独立的程序计数器——线程切换后回到正确的位置
ps.多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的

虚拟机栈(Virtual Machine Stacks)

(1) 线程私有,生命周期与线程相同
(2) 原理图
(3) 线程请求栈的深度大于虚拟机所允许的深度,抛出StackOverflowError;

       虚拟机栈动态扩展时无法申请到足够的内存,抛出OutOfMemoryError。

1

本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈作用相似,区别:虚拟机栈为虚拟机执行Java
方法服务,本地方法栈则为Native方法服务。

Java堆(Heap)

(1)最大的一块内存;
(2)被所有线程共享,在虚拟机启动时创建;
(3)唯一目的:存放对象实例;
(4)垃圾收集器管理的主要区域,因此也被称为GC堆。由于GC回收机制采用分代收集算法,所以堆还可以分为新生代和老年代; 从内存分配角度看,堆可划分出多个线程私有的分配缓冲区。
(5)不需要连续的内存,可以选择固定大小也可以通过-Xmx和-Xms控制虚拟机扩展,堆无法再扩展时,抛出OutOfMemoryError。

方法区

用于储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
不需要连续的内存,可以选择固定大小也可以通过-Xmx和-Xms控制虚拟机扩展,可以选择不实现垃圾收集。这区域的内存回收目标主要是针对常量池的回收和对象类型的卸载。

运行时常量池

(1)Runtime Constant Pool是方法区的一部分。

  • Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,发生于类加载后进入方法区的运行时。
  • 运行时常量池vsClass文件常量池:虚拟机规范对于运行时常量池无任何细节要求,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也储存在运行时常量池中;运行时常量池具备动态性,String.intern()方法可以将运行时新的常量放入池中。

直接内存

不是虚拟机运行时数据取的一部分,但这部分内存也被频繁使用,也可能导致OutOfMemoryError。
NIO(基于通道与缓冲区的I/O方式)可以使用Native函数库直接分配堆外内存,然后通过堆中DirectByteBuffer对象作为这块内存的引用进行操作。

相关文章
|
7天前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
21 3
|
15天前
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
40 2
|
16天前
|
人工智能 Java 编译器
Java零基础(3) - 区别JDK、JRE和JVM
【8月更文挑战第3天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
37 1
|
21天前
|
Arthas 监控 算法
JVM成神路终章:深入死磕Java虚拟机序列总纲
JVM成神路终章:深入死磕Java虚拟机序列总纲
|
21天前
|
监控 Oracle Java
(一)JVM成神路之初识虚拟机 - 探寻Java虚拟机的前世今生之秘
JVM(Java Virtual Machine)Java虚拟机的概念大家都不陌生,Java之所以可以做到“一次编译,到处运行”的跨平台性,其根本原因就在于JVM。JVM是建立在操作系统(OS)之上的,Java虚拟机屏蔽了开发人员与操作系统的直接接触,我们在通过Java编写程序时,只需要负责编写Java代码即可,关于具体的执行则会由JVM加载字节码后翻译成机械指令交给OS执行。
|
24天前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
26 3
|
29天前
|
Java 程序员 C++
大牛程序员用Java手写JVM:刚好够运行 HelloWorld
大牛程序员用Java手写JVM:刚好够运行 HelloWorld
|
27天前
|
Java Linux
JVM内存问题之在业务有损的情况下,遇到JAVA内存使用率高的问题,应该如何快速止损
JVM内存问题之在业务有损的情况下,遇到JAVA内存使用率高的问题,应该如何快速止损
|
27天前
|
监控 Java 编译器
JVM内存问题之当遇到JAVA内存使用率高的问题时,首先应该考虑哪些基本情况
JVM内存问题之当遇到JAVA内存使用率高的问题时,首先应该考虑哪些基本情况
|
21天前
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。