朱智文的专栏

让我们一起放逐我们的青春

java虚拟机管理的内存




1:程序计数器:每个线程都有一个独立的程序计数器,用来记录当

前线程所执行字节码的行号指示器,如果切换线程执行其他的线程的时候,字节码解释器就是通过这个计数器的值来制定下一个处理的字节码指令,

2:java虚拟栈:它是线程私有的,生命周期与线程相同,描述的 java方法的内存模型,每个方法被执行的时候都会创建一个栈帧(stack frame),用来存放局部变量,每个方法被调用到执行完的过程,都对应着每个栈帧在虚拟机中入栈到出栈的过程



本地方法栈:和java虚拟机栈相似,不同的地方在于他们服务的对象不同,java虚拟机栈为java方法服务的,本地方法栈为native方法服务的,其它都一样

java堆:是java虚拟机所管理的内存中最大的一块,也是所有线程所共享的一块区域,在java虚拟机启动的时候创建,存放的是java对象实例,java堆可以处于物理上不连续存储空间,只要逻辑上连续就行,就想磁盘空间一样,既可以设定固定大小,必要时也可以扩展,;但是如果,不可再扩展,切不可再分配内存给实例,就会出现内存溢出


方法区:和java堆一样,是所有线程所共享的一块区域,用来存放以被java虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,java虚拟机规范称它为是堆得一个逻辑部分,但是它却有一个“堆”的别名



3:运行时常量池:方法区的一部分,class文件中除了类的版本,字段,方法,皆空等信息外,还有一项信息叫常量池,用来存放编译期生成的各种字面量和符号引用,这些内容,让在类加载后存放到方法区的运行时常量池中;java虚拟机规范中没有做出对运行时常量池的规范;运行时常量池相对于class文件常量池,另外一个重要特征是具有动态性;就是说不要求常量一定在编译器产生,运行时也可以动态的加入,debug不就是一个例子么,动态的改参数调试



4:直接内存:(direct mermory)并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存也被频繁的使用,而且也可能导致异常出现,所以我们放到这里一起讲解;这个直接内存指的是:在java 1.4中新引入的NIO类,引入了一种基于通道与缓冲区的I/o方式,他可以使用native函数库直接分配堆外内存,然后通过一个存储在java堆里面的directbytebuffer对象作为这块内存引用进行操作(就是引用在堆里面,实例在外面),遮阳能在一些场景中显著提高性能,因为避免了在javadui

和native堆中来回复制数据

显然本机直接内存的分配不会受到java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存的大小及处理器寻址空间的限制,服务器管理员配置虚拟机参数时,,一般会根据实际内存设计-xmx等参数信息,但经常会忽略掉直接内存,使得各个内存屈辱的中和大于物理内存限制(包括物理上的和草错系统级的限制),从而导致动态扩展时出现内存溢出

5:


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014236541/article/details/49935013
个人分类: java虚拟机
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

java虚拟机管理的内存

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭