当前位置:网站首页>JVM概述和内存管理(未完待续)
JVM概述和内存管理(未完待续)
2022-07-27 17:07:00 【斯沃福德】
这里写目录标题
一. JVM概述
1. Java代码的运行过程

- 首先代码会被javac编译器 编译 成.class字节码(类的基本信息、常量池、方法定义)存于方法区;
- 然后字节码被JVM通过(方法区的)类加载器进行 加载 到方法区(元空间);
- 接着字节码中的方法定义中的虚拟机指令被解释器 解释 成机器码(根据不同的平台生成不同的机器码),这个过程会去常量池中查表;
- 然后分配执行这段指令需要的资源—主要是内存。
- CPU执行指令把结果写回内存了
2. Java跨平台运行如何实现 ?

为了实现平台无关性,java的编译器javac并不是将java的源程序直接编译成与平台相关的汇编指令,而是编译成一种中间语言,即java的class字节码文件。
字节码是可以跨平台运行的代码,通过不同平台上的JVM虚拟机生成对应平台(Linux、Windows、Android等)所需要的机器码(JVM运行于硬件层之上,屏蔽各种平台的差异性)
3. JVM 和用户进程的关系 ?
java my.class
运行以上的一个java程序,对应创建JVM 来加载和运行你的 Java 类;
过程:
操作系统会创建一个进程来执行这个java可执行程序,
而每个进程都有自己的虚拟地址空间,
JVM 用到的内存(包括堆、栈和方法区)就是从进程的虚拟地址空间上分配的。

需要注意的是,JVM 内存只是进程空间的一部分,除此之外进程空间内还有代码段、数据段、内存映射区、内核空间等。
JVM 的角度看,JVM 内存之外的部分叫作本地内存;
4. JVM结构

Java源代码编译成二进制字节码,经过类加载器加载到JVM中去运行
类放在方法区,实例对象在堆内存,而堆中的方法在调用时会用到 虚拟机栈、程序计数器、本地方法栈
然后方法执行时的每行代码是由 执行引擎中的解释器进行逐行执行
热点代码会被JIT即时编译器来编译,即优化后的执行
GC会对堆中不再被引用的对象进行回收
还有一些Java不方便实现的,需要调用底层操作系统的功能需要和本地方法接口打交道
二. JVM内存管理

线程私有:
1. 程序计数器
引入:
在JVM的多线程场景下,多个线程分时交替执行,
而同一时刻cpu只执行一条指令,那么就会发生上下文切换,也就是说切换线程时要 ①保存当前线程的指令,②然后恢复下一个线程的指令;
那么就需要每个线程有一个程序计数器,用来记录指令地址,以使得线程切换后恢复到正确的位置;
概念:
程序计数器是线程私有的一块较小的内存空间,看作是当前线程所执行的字节码的行号指示器。
物理上是通过寄存器来实现的,寄存器是cpu组件中读取速度最快的单元。
功能:⽤于记录当前线程执行的位置(当前线程中执行的字节码指令的地址),从⽽当线程被切换回来(上下文切换)的时候能够知道该线程上次运行到哪儿了。
特点:
①线程私有;
②程序计数器是JVM中唯一一个不会出现内存溢出的区域(堆、栈、方法区都可能会内存溢出)
2. 虚拟机栈
概念:
每个线程运行时所需要的内存,称为虚拟机栈。
每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存;
栈帧中存有局部变量表,用于存对象引用、基本数据类型;
但是栈顶只有一个,对应着当前正在执行的那个方法;
每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
虚拟机栈和本地方法栈为什么是私有的 ?
为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地⽅法栈是线程私有的。
垃圾回收是否涉及栈内存 ?
不会;
栈内存 存的就是一次次方法调用所产生的栈帧内存,而栈帧内存会随着方法调用结束 栈帧的弹出而释放,所以不需要GC管理。 GC只是回收堆内存中无用的对象。
栈内存分配越大越好吗 ?
可以指定栈内存Xss的大小;
不会。栈越大,反而会让线程数越少。因为物理内存大小是固定的,而栈内存越大,那么线程数就会少! 并不会增加效率。
方法内的局部变量是否线程安全 ?
即看多个线程对这个变量是共享的还是私有的。而局部变量是线程私有的,所以是线程安全的;
而如果局部变量是引用数据类型,并且逃逸出了方法的作用范围,需要考虑线程安全的问题。(而变量是基本数据类型的时候是安全的)
栈溢出:
https://blog.csdn.net/u010515202/article/details/106056592
边栏推荐
- DatePicker(日期选择器)与TimePicker(时间选择器)
- 【深度学习基础知识 - 49】Kmeans
- rxbinding
- Embedded C language structure
- Samsung will promote a number of risc-v architecture chips, and 5g millimeter wave RF chips will be the first to be adopted
- Release Samsung 3J1 sensor: the code implies that the safety of pixel 7 face recognition will be greatly increased
- Publish your own NPM component library
- Binary search tree
- Embedded C language loop deployment
- [basic knowledge of deep learning - 44] the method of realizing multiple classification by logistic regression
猜你喜欢
随机推荐
Ericsson admitted bribery in China and other five countries and paid a fine of $1.06 billion to the United States
台积电5nm即将量产:苹果A14独占7成产能,华为麒麟1020拿下3成
GestureDetector(手势识别)
A low code development platform that brings high-value user experience
S32k series chips -- Introduction
ToggleButton(按钮开关)
Big guys, Oracle CDC, local operation, always encounter this an exception occurred in
rxbinding
【深度学习基础知识 - 49】Kmeans
英特尔发布Horse Ridge芯片:22nm工艺,能够控制多个量子位
【深度学习基础知识 - 41】深度学习快速入门学习资料
GridView(实现表格显示图标)
c语言:6、指针的简单使用与注意事项
[basic knowledge of deep learning - 37] solve the imbalance between positive and negative samples
It is said that Apple plans to buy some JDI factories with us $200million
DatePicker(日期选择器)与TimePicker(时间选择器)
Use of jvisualvm
Fzu1669 right angled triangle
golang设置国内镜像,vscode配置golang开发环境,vscode调试golang代码
带来高价值用户体验的低代码开发平台









