有哪些可以大大提高程序员工作效率的方法或者工具呢( 二 )


看过一些对内存分配机制的解说,很多人都将内存分堆区和栈区,这种分法是比较粗糙,java内存的分配比这这复杂得多;
局部变量表:用于储存编译期可知的所有基本数据类型和对象引用类型,注意这里说的只是引用不是对象本身,其中64位长度的long和double类型占用两个局部变量空间,其余的都只占用一个局部变量空间,局部变量表所需要的内存空间在编译期的时候就分配完成,当进入一个方法的时候,这个方法需要在帧中分配多大的局部变量空间是完全可以确定的,方法运行期间不会改变局部变量表的大小;
【有哪些可以大大提高程序员工作效率的方法或者工具呢】 3本地方法栈
本地方法栈(Native Method Stack), 与虚拟机栈发挥的作用其实是非常相似的,他们的区别不过是虚拟机栈是为虚拟机执行java方法(也就是字节码)服务的,而本地方法栈则是为虚拟机使用的Native方法服务的,注意有的虚拟机是将虚拟机栈和本地方法栈合二为一使用的;
4java堆
对于大多数的应用来说,java堆算是虚拟机管理的最大的一块内存区域了,java堆是被所有线程共享的一块内存区域,在虚拟机启动的时候创建,此内存唯一的目的就是存放所有实例对象,几乎所有实例对象都在这里分配内存的,为什么说是几乎而不是全部呢?因为随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配和标量优化技术会导致一些微妙的变化,所有对象都在堆上分配已将不是那么绝对了;
java堆是垃圾处理器主要管理的区域,所以很多时候也叫GC堆(Garbage Collected Heap),可别翻译成垃圾堆哦 哈哈,从内存回收的角度来看,由于现在收集器基本都是基于分代收集算法,所以java对还可以分为新生代和老生代,再细一点又可以分 Eden空间,from,survivor,to等
根据虚拟机规范规定,java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的就可以,就像我们的磁盘空间一样;
5方法区
方法区和java堆一样,是各个线程共享的内存区,它用于已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,虽然java虚拟机规范将方法区划分为堆的一个逻辑部分,但它有一个别名即非堆,目的应该是将它和java堆区分开来;
对于习惯在HotSpot虚拟机上开发,部署的开发者来说,很多人愿意把方法区称为“永久代”,
HotSpot虚拟机 https://www.cnblogs.com/charlesblc/p/5993804.html
java虚拟机规范对方法区的限制非常松懈,除了和java堆一样不需要连续的内存和可以选择固定大小的或者可扩展外,可以选择不实现垃圾收集;
6运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池(Constant Pool Table),用于存放编译器生成的字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中储存;
java虚拟机对Class文件的每一部分(包括常量池)的格式都有严格规定,每一个字节用来储存哪一种数据都要严格按照规范要求才会被虚拟机认可,装载和执行,但对于运行时常量池java虚拟机没有做任何细节上的要求,不同的提供商实现的虚拟机可以根据自己的需要去实现这个内存区域 ,
既然运行时常量池属于方法区的一部分自然受方法区内存的限制,当常量池无法申请到内存的时候就会报OutOfMemoryError异常;
学Java刚入门或者想入门的小伙伴,可以关注我的主页
@卫婷Elisa
关注我的专栏,一起加油~!
Java学习


推荐阅读