【修真院java小课堂】JVM运行及内存分配

        写内存分配之前得明白java程序是如何运行的:我们编写的java文件java虚拟机(JVM)是不能运行的,得通过java编译环境进行编译,将其编译成二进制的文件,传输到java运行环境,由类加载器加载java标准库、扩展库以及编译的文件。执行文件之后通过JVM中的移植接口与各种不同的系统连接,最终解释成机器码加载到机器上。JVM实现了java语言的跨平台,而且由于JVM执行的是二进制文件,所以java可以说也是“跨语言”的。
        既然JVM对于java至关重要,那么java程序在JVM中运行时的内存又是如何分配的呢?
        JVM的内存构成如下图,初始值是物理内存的1/64,分为栈内存、堆内存、方法区、程序计数器、本地方法栈等。下面来介绍一

        下主要存储部分具体所存储的是什么。
        栈内存:
                本地变量(Local Variables):输入参数和输出参数以及方法内的变量;
                栈操作(Operand Stack):记录出栈、入栈的操作;
                栈帧数据(Frame Data):包括类文件、方法等等。
        堆内存:主要是new Object() 
        常量池:直接常量(基本数据类型、String)、对其他类型、方法、字段的符号引用。编译时就已经创建好。
        需要注意的是,栈内存是线程私有的,用的时候开辟空间存储,不用的时候立即释放;而堆内存和常量池是线程共享,新建的对象不管有没有被引用,会一直存在,知道被Gabege Collection回收或者JVM结束之后释放。所以在程序之中尽量少用new新建对象,减少对堆内存的占用,提高JVM的性能。

        那么Gabege Collection是如何工作的呢?①程序new对象的时候,对象首先在伊甸区创建;②当伊甸区满了的时候,GC(gabage collection)扫描伊甸区中的对象一次,把有指引的对象复制到幸存者0区,释放其他无效对象③当伊甸区再次满了的时候,把有效对象复制到幸存者1区,同时,也将第一个幸存者0区中的有效对象复制到第二个幸存者1区。④如果填充到幸存者1区中的有效对象被幸存者0区或伊甸区中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到永久储存区,一直到JVM实例关闭,堆内存释放。


猜你喜欢

转载自blog.csdn.net/qq_41810013/article/details/79992935
今日推荐