JVM虚拟机 底层原理分析与性能优化

本文详细解析了Java虚拟机(JVM)的内部结构,包括方法区、虚拟机栈、本地方法栈、程序计数器和堆的职责。阐述了内存回收机制,新生代与老年代的垃圾回收算法,以及如何避免内存溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看了关于jvm的一些视频,个人对jvm的一些进行一下总结。

目录

1.JVM的概念:

方法区

虚拟机栈

本地方法栈

程序计数器

 堆

JVM关于内存回收

新生代

老年代


1.JVM的概念:

JVM,Java Virtual Machine, java虚拟机。通过将java字节码文件转换成os需要的机器代码实现java文件的执行,java虚拟机实现了java的跨平台性。

现在来依次说明各个分区的作用:

方法区

通俗的来理解,方法区存储的是和类有关的信息。比如静态变量,类的字段,方法等信息。存放的是类的字节码文件也就是class文件。

虚拟机栈

程序通过线程的创建运行,jvm为每一个线程分配一个独立的内存空间,这个内存空间叫做虚拟机栈。在这个栈中运行程序中的方法,负责方法的进入,运行和退出。遵从的是先进后出原则。每一个方法的运行都会为此创建一个栈帧。栈帧的结构分为“局部变量表、操作数栈、动态链接、方法出口”几个部分。

本地方法栈

功能和虚拟机栈类似,作用是支撑Native方法的调用、执行和退出。

程序计数器

用于存放下一条指令所在单元的地址的地方。

 堆

 堆内存用于存放由实例化的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。

下面我用一个简单的程序来计算的

首先jvm开启main线程,在其中放入main方法栈帧 ,之后由于创建了一个app对象。这个app对象放在堆内存中,而这个指向app对象的引用则是在main栈帧之中。然后,创建了一个result局部变量,并且将add方法加入到main线程中并开启一个add方法栈帧。add方法中的局部变量a和b依次创建并且按照先入后出原则离开栈。最后运行的是输出result这条语句等到执行完这条语句后main方法退出。main线程结束。

JVM关于内存回收

上文说过,所有实例化的对象都会放在堆中,但是堆的内存空间是很有限的。如果jvm一味地创建对象而不去回收对象,那么堆内存就会出现溢出。所以jvm将堆分为了新生代,老年代和永生代三个部分。我主要对新生代和老年代的垃圾回收算法进行了总结。

新生代

新生代分为Eden区,Suvivor:From区,Suvivor:To区。

新生代(Minor GC)的垃圾回收算法是复制算法,也就是将Eden区和Suvivor:From区的内容复制到Suvivor:To区中。然后将From去和To区的位置互换。并且将对象的age自增一,如果From区中对象的年龄增加到了15,则将对象移动到老年代中。

老年代

老年代(Full GC)的垃圾回收算法分为标记-清除算法和标记-整理算法。对于这些年龄较大的对象,通常采用的就是将其直接删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值