《Java专栏》— JVM 内存机制
来源:互联网 发布:centos 默认启动kde 编辑:程序博客网 时间:2024/06/07 12:24
Java寄存器
程序就是对内存的操作
所有进程都使用寄存器,Java虚拟机使用下列寄存器管理系统堆栈:
程序记数寄存器:跟踪程序执行的准确位置;
堆栈指针寄存器:指示操作栈项;
框架寄存器:指向当前执行的环境;
变量寄存器:指向当前执行环境中第一个本地变量。
Java开发组决定Java只有四个寄存器,如果寄存器多于处理机端口数,处理器的效率将严重下降。
Java虚拟机中的堆栈用于存放变量,Java程序向Java虚拟机传递字节码,Java虚拟机为每个方法创建堆栈框架,每个框架维护三种信息:
局部变量:由变量寄存器指向的32位变量数组
执行环境:由框架寄存器指向和执行的方法
操作堆栈:执行先进先出规则(FIFO),它是32位宽度的,它为操作码维护必要的参数,该堆栈的顶部是由堆栈指针寄存器索引的
思维:
寄存器是速度最快的存储场所,因为寄存器位于处理器内部,这一点和其它的存储媒介都不一样。不过寄存器个数是有限的。
在内存中的寄存器区域是有编译器根据需要来分配的。 程序开放人员不能够通过代码来控制这个寄存器的分配。我们感觉不到寄存器的任何存在的迹象。
Java 栈
Java内存分配中的栈,在函数定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出其作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
Java 堆
Java内存分配中的堆,堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。
实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!
Java常量池
常量池指的是编译期间就被确认,并被保存在已编译的 .class文件中的一些数据。
虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。
对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池会储存在Method Area,而不是堆中。
- 《Java专栏》— JVM 内存机制
- Java jvm 内存回收机制
- JAVA JVM内存回收机制
- 【Java】【JVM】内存分配机制
- JVM——Java内存管理及GC机制
- Java虚拟机(四)-JVM内存机制
- java 深度解析JVM内存分布机制
- Java内存机制详解|JVM初步
- JVM内存机制资料
- JVM内存机制
- JVM内存分配机制
- jvm内存回收机制
- jvm内存回收机制
- JVM内存机制详解
- jvm 内存回收机制
- JVM内存GC机制
- JVM的内存机制
- jvm内存回收机制
- layui表单提交时出现一闪而过的验证信息的原因
- 实验八--排序算法
- 利用pybombs安装最新源码软件,包括gnuradio, uhd, hackrf, limesuite, gqrx, 以及各种gnuradio模块.
- maven工程的mapper文件不发布发到target目录下的问题
- 这样找回回收站误删文件,非常靠谱!
- 《Java专栏》— JVM 内存机制
- Linux更改文件属性权限
- Javascript http请求的终极解决方案Flyjs
- Docker容器技术介绍(六)--- 端口映射和容器间互访问
- linux tomcat service 方式启动脚本
- idea在autowired时出现编译红线 !Strings.isNullOrEmpty(planname)
- Linux系统自动化安装,dhcp服务配置
- 以后请每天做一个codewars好吗。
- Maven学习---笔记 (未完)