Java虚拟机学习总结一ITeye - 娱乐之横扫全球

Java虚拟机学习总结一ITeye

2019-01-11 19:22:53 | 作者: 运骏 | 标签: 虚拟机,办法,目标 | 浏览: 1091

Java运转包含4个方面,Java代码(.java)、Java编译文件(.class),Java虚拟机,Java运用程序接口。Java代码经过编译器编译成为类文件,然后被装载到字节码内存中,经过类加载放入虚拟机中,最终经过操作系统和适配器完结,而JVM则处于中心方位。

Java虚拟机
Java虚拟机是java根底部分,Java言语具有跨渠道的特性,这也是由JVM来完结的。更精确地说,是Sun运用JVM在不同渠道上的完结帮咱们把渠道相关性的问题给处理了。Java言语支撑经过JNI(Java Native Interface)来完结本地办法的调用,可是需求注意到,假如你在Java程序用调用了本地办法,那么你的程序就很或许不再具有跨渠道性,即本地办法会损坏渠道无关性。JVM包含类加载子系统、运转数据区、履行引擎和本地办法接口。
(生命周期总结:当一个java程序启动时,JVM就发生一个实例;程序完毕是,实例也就消失了。Java虚拟机一般开端与一个main办法,这个办法是public static void润饰,JVM要调用有必要是public,而且不经过目标调用,所以是static,而且因为JVM现已是底层,不会有任何回来,回来类型就成了void。)



运转时数据区
即内存空间,一般咱们装备-Xms、-Xmx信息都是设置的内存,Xms表明初始内存,Xmx表明最大内存,Xmn表明设置年青代内存等等。内存空间首要由Java堆heap、办法区method area、本地办法栈、程序计数器、Java栈组成。其间Java堆、办法取每个线程公有,而本地办法栈、程序计数器、Java栈是线程私有。

程序计数器
一块较小的内存空间,是当时线程所履行的字节码的行号指示器。Java虚拟机的多线程是经过线程轮番切换履行,一个确认时间,一个处理器切当说是一个内核,只会履行一条线程的指令,为了线程切换能够康复正确方位,所以需求有一个独立的程序计数器。

Java虚拟机栈
相同为线程私有,便是java办法履行的内存模型,每个办法履行时都会一起创立一个栈帧,用户存储局部变量表、操作栈、动态链接、办法出口信息。每一个办法被调用直至完结进程,便是入栈到出栈的进程。
局部变量表寄存了各种根本数据类型,目标引证类型(一个指向目标开始地址的引证指针,或许一个代表目标相关的方位),和returnAddress类型(指向一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完结分配,而且空间现已固定,不会改动。
(后期学习:检查java字节码,运用 javap -verbose class文件;java -verbose文件名称 注此处没得后缀 是检查加载了哪些jar包和文件;javac -verbose java文件 是看虚拟器加载类哪些东西)

本地办法栈
本地办法栈与Java栈根本相同,只不过Java虚拟机栈是处理java办法(字节码)效劳,而本地办法栈是为虚拟机运用Native办法效劳。

Java堆 Heap
Java堆是虚拟机内存中最大的一块,Java对是被一切线程同享的一块内存区,用来寄存目标实例。Java堆也是废物搜集器办理的首要区域,因为现在废物搜集器根本都是选用的分代搜集算法,所以Java堆根本能够分为重生代、老时代和耐久代,重生代再分为Eden空间、From survivor空间和To survivor空间。
重生代:用于寄存重生的目标,目标在分配时首要分配到Eden区,当Eden区没有满足空间时,就会进行一次minor GC。经过-Xmn设置重生代巨细,-XX:NewRatio=参数 设置重生代与老时代的内存空间比,-XX:SurvivorRation=参数 设置Eden区和Survivor比。
当Eden区进行minor GC后,假如目标经过一次收回而且还存活,能被Survivor去接纳,就会移到Survivor(From)区,包含原From去中的目标,并将其年纪设置为1,每熬过一次minor GC年纪就会加1,当到达必定年纪后,就会提升到老时代中。每次进行GC操作(Eden和From区),From区目标引进to区,而且和To区进行逻辑交换,确保一个Survivor区是空的,假如在放入To或许survivor区中内存不行时,会被放入Old区。Survivor规划成为两个区,应该收回中挑选更契合Old区条件的目标,因为Old区进行收回价值比较高
老时代:寄存生命周期长的目标,或许是大目标(包含Eden区或许Survivor区无法放下的目标),当Old区被占满时就会进行完结的废物收回Full GC(Major GC)包含重生代。Full GC完结后,留下来的内存就会办法Permanent区(耐久代)中。

办法区
办法区和Java堆相同,是各个线程共有的公共区域,用来寄存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也能够被称作“永久代”,但两者本质上并不相同,仅仅把GC分代搜集扩展到办法区了,相对Java堆而言,废物搜集行为在访法区比较罕见,首要针对常量池的收回和对类型的卸载。

运转时常量池
运转时常量池是归于办法区的一部分,是寄存编译期生成的各种字面量和符号引证,当类被加载后,这些信息就会放入到访法区运转时常量池中。别的,运转区常量还具有动态特征,不要求常量必定要在编译期发生,运转期间也或许将新的常量放入常量池中,如String的intern办法。

直接内存
不是JVM中一部分,是因为new I/O 能够运用native直接分配堆外内存,然后经过存储在java堆里边的DirectByteBuffer目标作为这块内存的引证进行操作。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章