JVM知识点总结

<<Java虚拟机规范>>

堆:

Java堆可以处于物理上不连续的内存空间中,但在逻辑上应该被视为连续的。

所有对象实例及数组都应该堆上分配。注意:虽然规范是这样的,由于及时编技术的进步,尤其

逃逸分析技术的日渐强大,栈上分配、表量替换。

Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。


栈:

HotSpot虚拟机的栈容量是不可以动态扩展的


方法区

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作"非堆"(Non-Heap),目的是与Java堆区分开来。


具体实现


类什么时候会被加载

1.创建类实例

2.使用类的静态变量或静态方法

3.使用反射机制访问类

4.JVM启动时,自动加载的基础类

Java中的类加载其实是延迟加载的,除了一些基础的类外。都是在使用类时才会进行加载。


堆和栈的区别

存储位置不同

存储的内容不同

抛出的异常不同

栈的存储速度比堆块,执行效率较高


Java虚拟机栈:线程私有,方法的每次调用都会创建一个栈帧,栈帧主要包含:

局部变量表(保存局部变量)

操作数栈:主要用来保存计算结果的中间的中间结果,同时作为计算过程中变量临时的存储空间

动态链接:如果被调用的方法在编译期无法被确定下来,只能够在程序运行期将调用的方法的符号转换为直接引用,由于这种引用转换过程具备动态性,因此也被称之为动态链接。

方法出口等信息。当方法执行完毕之后,这个栈帧就会别弹出,变量最用域就会结束。

堆:内存中最大的一块内存区域,几乎所有实例的分配都在此。注意 :新生代和老年代等只是某一类虚拟机所有的,并不在jvm规范中存在

相关推荐
勘察加熊人17 分钟前
wpf+c#路径迷宫鼠标绘制
开发语言·c#·wpf
在京奋斗者21 分钟前
spring boot自动装配原理
java·spring boot·spring
小黄人软件1 小时前
C# ini文件全自动界面配置:打开界面时读ini配置到界面各控件,界面上的控件根据ini文件内容自动生成,点保存时把界面各控件的值写到ini里。
开发语言·c#
明天不下雨(牛客同名)3 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
多多*3 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
Android洋芋4 小时前
C语言深度解析:从零到系统级开发的完整指南
c语言·开发语言·stm32·条件语句·循环语句·结构体与联合体·指针基础
bjxiaxueliang4 小时前
一文详解QT环境搭建:Windows使用CLion配置QT开发环境
开发语言·windows·qt
Run_Teenage5 小时前
C语言 【初始指针】【指针一】
c语言·开发语言
苹果.Python.八宝粥5 小时前
Python第七章02:文件读取的练习
开发语言·python
胡图蛋.5 小时前
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
java·spring boot·后端