马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
JVM是Java Virtual Machine(Java假造机)的缩写,JVM是在利用体系之上重新假造出来的一套体系,是Java步伐(不光仅是java步伐,只要是符合JVM字节码规范的步伐,好比Kotlin、 Groovy、 Scala这些语言的步伐也是可以运行的)的运行环境,负责将字节码转换为呆板码并实行。
JVM的作用
3.1 write once,run anywhere(一次编写,随处运行)
学过java的同砚应该都听过吧,Java号称一次编写,随处运行,着实真正实现随处运行的就是JVM,JVM提供的字节码步伐运行环境屏蔽了差别利用体系(windows、macOS、linux体系等)的差别,由JVM去适配各个利用体系的接口,也就是说差别的利用体系有差别的JVM实现,从而实现java语言跨平台运行的本事,到达一次编写随处运行的效果。
JVM提供的是步伐的运行环境,它并不关心你用的是什么语言,只要终极编译后的字节码符合JVM规范,它都可以运行,如许就使得代码和运行环境分开了,同一份代码编译后就可以在差别的利用体系上由对应的JVM去运行。开发的时间我们安装的是JDK,JDK包罗了开发的一些工具集,也包罗了JRE(Java Runtime Environment,java步伐运行环境),这个JRE包罗了JVM,而生产上一样寻常只须要安装JRE去运行我们编译好的class字节码文件即可。
3.2 自动内存管理
C和C++语言都是通过手动利用自动去申请内存和开释内存,固然机动但是稍不注意没有开释就大概导致内存走漏,而JVM有本身的内存管理机制,开发同砚不消过多关注内存的申请和开释,会合精神放到业务实现上,内存的分配和接纳都由JVM去管理(固然JVM也大概会导致内存走漏,更多的缘故起因大概是代码题目大概内存分配及垃圾接纳参数设置不公道,调优即可)。
在java步伐中,对象占用的空间内存分配由JVM来分配,对象无任何引用不再使用时,由JVM选择符合的机会举行垃圾接纳,自动开释所占用的空间。
假造机栈
假造机栈形貌的方法实行的内存模子。在每个方法实行的同时会创建一个栈帧,用于存储局部变量表、利用数栈、动态毗连、方法出口等信息。每一个方法调用实行完成,都对应着一个栈帧在假造机中入栈到出栈的过程。
局部变量表:存放的是方法参数和方法内界说的变量。局部变量表在编译时就确定了局部变量表的巨细, 一个局部变量可以生存一个范例为boolean、byte、char、short、int、float、long、double、reference和returnAddress范例的数据。 long和double占用2个局部变量空间,别的范例占用1个局部变量空间。
利用数栈:和局部变量表一样,利用数栈在编译时也确定了栈深度。利用数栈可以明白为java假造机栈中的一个用于盘算临时数据的存储区(寄存器)。
动态毗连: 一个方法调用另一个方法,在栈帧中只会存储另一个方法的符号引用,须要将其转换成内存地点。
方法出口:生存现场和规复现场。
假造机栈的巨细默认是1M。
本地方法栈
java调用c/c++的动态链接库,运行内里函数所须要的栈。JNI
Hot-Spot假造机直接就把本地方法栈和假造机栈合二为一。与假造机栈一样,本地方法栈也会在栈深度溢出大概栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError非常。
方法区
方法区只是一个java假造机的规范,在jdk8从火线法区的具体实现是***永世代***,jdk8方法区的具体实现***元空间***
重要存储类的元信息(IntanceKlass)
Java7及从前版本的Hotspot中方法区位于永世代中。同时,永世代和堆是相互隔离的,但它们使用的物理内存是一连的。 永世代的垃圾网络是和老年代捆绑在一起的,因此无论谁满了,都会触发永世代和老年代的垃圾网络。 但在Java7中永世代中存储的部门数据已经开始转移到Java Heap或Native Memory中了。好比,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap
JVM内存布局重要有三大块:堆(heap space)、方法区(method area/ PermGen/ MetaSpace)、本地域(native area)。
堆内存
堆内存(heap space)存放全部线程共享的对象和数组。在假造机启动时创建,Java堆是垃圾网络器管理的重要地域,因此很多时间也被称做“GC堆”。GC接纳的计谋是按代接纳。
对象在实例化后的整个运行周期内,都被存放在堆内存中。堆内存又被分别成差别的部门:是JVM中最大的一块由年轻代(Young Generation Space)和老年代(Old Generation Space)构成。而年轻代内存又被分成三部门,伊甸区(Eden)、From Survivor空间、To Survivor空间(幸存者地域(Survivor Sapce)包罗From Survivor空间、To Survivor空间)。默认环境下年轻代按照8:1:1的比例来分配。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |