前言

jvm是java为了实现一次编译多处运行的秘籍,在jvm里面抽象出来了一个虚拟的机器,jvm为自己设计了一套内存模型——堆、栈、本地方法栈、方法区、程序计数器


一、堆

Java堆是虚拟机中生产和管理对象的一块儿内存。几乎所有的对象会在堆内存上进行创建,同时堆内存也会对这些内存进行管理,对于大部分的对象都是朝生夕灭。堆内存中需要一些算法来清理这些内存。
其中较为人知的包括对象标记算法——可达性分析。为了更好地回收内存,堆内存的分带管理,对于堆内存分为edan, from suviver, to suviver, old 等几个区域。并对于不同的区域使用不同的清理算法。包括对于edan区会设置标记整理算法,对于老年代会有标记清理算法等等。
这个区域是在Jvm中各个线程共享的区域,同时如果再分配内存的时候,如果在堆上无法再创建对象了,那么这时会跑出OutOfMemoryError异常。

二、虚拟机栈 / 本地方法栈

虚拟机栈是JVM中跟方法调用有关的一个内存。在栈中,每一次调用方法会同步创建栈帧,在栈帧中存储局部变量表,操作数栈,动态链接,方法出口等信息。一个方法的调用和完成就是一个栈帧入栈和出栈的过程。
为了保证JVM的方法能够每个线程正常地执行,虚拟机栈也是线程私有的。
局部变量表中存在了方法中的基本数据类型(int, double, long)和引用类型和返回地址类型。
如果对于虚拟机栈调用深度过长,那么就可能会跑出StackOverflowError。

三、方法区

方法区是用于存储Java程序的一些元数据信息,包括类信息,常量和静态变量,即时编译后生成的代码缓存等数据。在hotspot上,jdk8之前,会使用永久代来实现一个方法区,同时对于方法区的回收基本上是很难去做到的。而在jdk8之后,已经改为元空间来实现一个方法区了。
方法区可以说也是存放一些程序数据时会用到的,也是多个线程会同时访问的区域。如果在虚拟机中程序运行的时候,方法区内存不够,也会跑出OutOfMemoryError异常

四、程序计数器

程序计数器是一块比较小的空间,相似与计算机内部的程序计数器,它会指向正在执行的代码行号。不过在JVM中的程序计数器是线程私有的,这样可以做到每个线程执行的程序互不影响,独立存储。

五、运行时常量池

运行时常量池是方法区的一部分,用于存放在编译器生成的各种字面量和符号引用,这部分内容将在类加载之后存放在方法区的运行时常量池

六、直接内存

在NIO中可以通过native函数直接分配对外内存,避免了Java堆和native对之间来回复制数据。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。