
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java编程开发随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,java虚拟机内存优化分享。
程序计数器
程序计数器(ProgramCounterRegister)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
程序计数器是一块“线程私有”的内存,各个线程相互独立存储,互不影响。
Java虚拟机栈
Java虚拟机栈(JavaVirtualMachineStacks)描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(StackFrame),栈帧中存储着局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,会对应一个栈帧在虚拟机栈中入栈到出栈的过程。与程序计数器一样,Java虚拟机栈也是线程私有的。
本地方法栈
本地方法栈(NativeMethodStack)与Java虚拟机栈作用很相似,它们的区别在于虚拟机栈为虚拟机执行Java方法(即字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
在虚拟机规范中对本地方法栈中使用的语言、方式和数据结构并无强制规定,因此具体的虚拟机可实现它。甚至有的虚拟机(SunHotSpot虚拟机)直接把本地方法栈和虚拟机栈合二为一。与虚拟机一样,本地方法栈会抛出StackOverflowError和OutOfMemoryError异常。
Java堆
对于大多数应用而言,Java堆(Heap)是Java虚拟机所管理的内存中大的一块,它被所有线程共享的,在虚拟机启动时创建。此内存区域的目的是存放对象实例,几乎所有的对象实例都在这里分配内存,且每次分配的空间是不定长的。
在Heap中分配一定的内存来保存对象实例,实际上只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中),在Heap中分配一定的内存保存对象实例和对象的序列化比较类似。对象实例在Heap中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap中的位置,便于找到该对象实例。
Java虚拟机规范中描述道:所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展和逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都在堆上分配的定论也并不“绝对”了。
方法区
方法区(MethodArea)与Java堆一样,是各个线程共享的内存区域。ObjectClassData(类定义数据)是存储在方法区的,此外,常量、静态变量、JIT编译后的代码也存储在方法区。正因为方法区所存储的数据与堆有一种类比关系,所以它还被称为Non-Heap。
在Java7及之前版本,我们也习惯称方法区它为“永久代”(PermanentGeneration),更确切来说,应该是“HotSpot使用永久代实现了方法区”.
运行时常量池
运行时常量池(RuntimeConstantPool)是方法区的一部分,用于存放编译期生成的各种字面量("zdy","123"等)和符号引用。
直接内存
直接内存(DirectMemory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但这部分内存也被频繁运用,而却可能导致OutOfMemoryError异常出现。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。