在java中,内存的管理分为几个部分知道吗?我们日常开发中常常将的堆,栈等在内存中又是扮演者什么样的角色呢?各自的职能是什么呢?
java虚拟机将内存分为五大块:Heap(堆),JVM Stacks(虚拟机栈),Native Method Stacks(本地方法栈),Program Counter Register(程序计数器),Method Area(方法区)
注:方法区和堆是所有线程共享的,栈为线程是有的;
一,Heap(堆)
对于大多数应用来说,堆是java虚拟机管理内存最大的一块区域,存放对象实例,凡是new出来的对象都放在堆中;
二,stack(栈)
存放基本数据类型,常量,局部变量,对象的引用地址,描述的是程序执行动作,比如每个方法被执行的时候都会常见一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息;每一个方法被调用的过程就对应一个栈帧在虚拟机中从入栈到出栈的过程;
本地方法栈,和虚拟机栈的作用相似,区别是,虚拟机栈执行的是Java方法,也就是字节码,而本地方法栈则为虚拟机使用到的native方法服务,可以底层调用c或者c++;
三,程序计数器
程序计数器是一块很小的内存空间,他是线程私有的,可以认作为当前线程的行号指示器;
四,方法区
方法区和堆一样是所有线程共享的内存区域,用于存储被虚拟机加载的类信息,静态变量和字符串常量;
注:方法区中有一部分区域称为:常量池,存放class文件的字段,接口,方法等描述信息等
在jdk7之前,方法区也被称为永久代,因此没有强制要求方法区必须实现垃圾回收,不过自动jdk7开始,Hotspot虚拟机便将运行时常量池从永久代移除了;
一个程序的执行,先要从程序存放地加载到内存区,然后找到内存区中的main方法执行,在这个执行过程中,内存就会对其进行管理.
堆和栈的比较:
堆的特点是,受GC控制,自动回收不使用的数据,动态分配内存大小,但是存取的速度慢
栈的特点是,存取速度快,数据为线程独享
常用的设置堆内存的参数配置:
- -Xms设置堆的最小空间大小。
- -Xmx设置堆的最大空间大小。
一般来说,这两个设置的值为一样的,避免程序运行中堆内存受GC影响频繁的调整;
下一节,介绍一下GC;敬请期待…
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/09/15/java2-3/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!