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

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

目录

1.JVM的概念:

方法区

虚拟机栈

本地方法栈

程序计数器

 堆

JVM关于内存回收

新生代

老年代


1.JVM的概念:

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

JVM虚拟机 底层原理分析与性能优化_第1张图片

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

方法区

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

虚拟机栈

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

本地方法栈

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

程序计数器

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

 堆

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

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

JVM虚拟机 底层原理分析与性能优化_第2张图片

首先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)的垃圾回收算法分为标记-清除算法和标记-整理算法。对于这些年龄较大的对象,通常采用的就是将其直接删除。

你可能感兴趣的:(jvm,jvm)