概述
内存
JAVA是在JVM所虚拟出的内存环境中运行的,JVM内存区域主要包括:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。
线程独占:
程序计数器:
计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器。
虚拟机栈(stack):
常说的栈也就是虚拟机栈,栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。局部变量表主要存放基本类型变量数据和对象的引用。z(不是对象)。每一次函数调用都会有一个对应的栈帧被压入Java栈,每一个函数调用结束后,都会有一个栈帧被弹出。
本地方法栈:
和虚拟机栈的作用相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。即执行的方法是本地方法,同样创建栈帧。
线程共享:
堆(heap):
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
方法区(method):又叫静态区,所有线程共享。方法区包含所有的类信息和static变量。
常量池(方法区中):存放字符串常量、基本类型常量(public static final)和类信息(这些都是不会改变的,比如:一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型)。
注意:Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用常量池
Boolean同样可以使用,Double、Float没有实现。
//在值小于127时可以使用常量池
Integer i1=127;
Integer i2=127;
System.out.println(i1==i2); //输出true
//值大于127时,不会从常量池中取对象
Integer i3=128;
Integer i4=128;
System.out.println(i3==i4); //输出false
常量池有三种形态:静态常量池、运行时常量池 、全局字符串常量池。
- 所谓静态常量池 ,即*.class文件中的常量池。class文件中的常量池包含各种字面量(Literal)和符号引用(Symbolic References)。
在JDK1.7之后。
- 字符串常量池:字符串常量池移出方法区,存入堆中,全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。
- 运行时常量池:当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。class常量池中存的是字面量和符号引用,也就是说他们存的是对象的符号引用值。验证,准备然后经过解析之后,也就是把符号引用替换为直接引用,解析的过程运行时常量池会去查询全局字符串池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与全局字符串池中所引用的是一致的。
在JDK1.8之后,为了解决永久代内存溢出的情况,提出meta space(元空间)概念,方法区的实现变成了元数据区。元数据和永久代本质上都是方法区的实现。
本地内存:
直接受操作系统管理,属于“内核态”,在数据区域向磁盘写数据时,数据会被先复制到本地内存,然后再写入磁盘,使用本地内存避免了这个操作。
直接内存:
直接内存不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。在JDK1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用 进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
最后
以上就是震动雪糕为你收集整理的Java—JVM的内存内存的全部内容,希望文章能够帮你解决Java—JVM的内存内存所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复