
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java编程开发语言是目前软件编程开发市场中使用范围和频率都非常高的一个编程开发语言,今天我们就通过案例分析来简单了解一下,java虚拟机内存管理知识分享。
本地方法栈NativeStack
在虚拟机中,不但运行java方法,还会运行本地方法,也就是常见的Native关键字修饰的方法。在虚拟机栈中,会为每个线程独立的开辟一个专门运行java语言(更准确的说应该是字节码)的方法栈,但是对于本地方法,则是使用另外的一块内存区域来保存线程的调用状态,这块区域就是本地方法栈。他的作用跟虚拟机栈基本相似,其区别就是一个为java方法服务,一个为Native发光法服务。在虚拟机规范中,对于本地方法栈中的结构、方法的语言、方式,都没有强制规定,各个虚拟机可以自由的实现它。
Java堆JavaHeap
我们平常所说的,在堆中创建一个实例,指的就是这个堆。这是虚拟机所管理的内存中大的一块。在虚拟机中,几乎所有的实例以及数组所分配的内存空间都会被放置在这个堆中。
由于java堆是对象实例的的主要存放位置,因此虚拟机的垃圾回收机制的主要工作区域。
根据Java的内存回收机制,我们可以将堆的大小和内容划分成如下的形式:
根据java堆的特性,我们也可以知道,这块区域是一块线程共享的区域。同时我们也可以看出来,这块区域,所可以使用在物理上非连续的内存,只要在逻辑上保持连续即可。
方法区MethodArea
方法区的主要作用是保存类信息、常量、静态变量以及即时编译后的代码等数据。这个区域中的数据仍然会被GC的代回收所涉及到。我们平常所说的永久代,指的就是这个区域。
尽管这个区域也被称之为永久代,但是当数据进入这个区域中,仍然可能会被回收。这个区域的回收目标主要是常量池的回收,以及类型的卸载。
运行时常量池RuntimeConstantPool
这块区域属于方法区的中的一块子区域。
在Class文件中,除了有类版本、字段、方法、接口等,还有一个信息区域是常量池。常量池中的数据将会在类被加载后,存在到运行时常量池中。
而类文件中的常量池主要包括各种字面量和符号引用。符号引用在讲解栈帧时,有所涉及。
字面量可以理解为java语言中的常量,如字符串、final修饰的变量等。
符号引用则是指以下三种固定信息:
(1)类和接口的全限定名称
(2)字段的名称和描述符
(3)方法的名称和描述符
java语言在编译成Class文件后,并没有关于方法和字段在内存中终布局的信息。所以当虚拟机使用这些变量或方法时,需要先从常量池中,找到这些数据对应的符号引用,然后在方法的栈帧中的动态连接区域中找到其对应的内存真实位置。
在日常工作中,我们经常会遇到两种内存溢出的错误:
1、OutOfMemoryError
2、StackOverflowError
OutOfMemoryError指的是一个区域中,由于数据的不断增加,导致区域无法再从物理内存总申请到更大的空间,或者是区域所申请的空间已经到达虚拟机运行参数所给该区域设定的大值,那么就会抛出这个错误。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。