java内存空间简述
JVM的内存空间:
- 1. 寄存器 (Registers):最快的保存区域,位于处理器内部,由编译器分配。主要作用是记录当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变当前线程的程序计数器选取下一条字节码指令来工作。任何分支、循环、方法调用、判断、异常处理、线程等待以及恢复线程、递归等都是通过这个计数器来完成。为了多线程的实现,每条线程都会有独立的程序计数器来记录当前指令的行号,以使得线程等待结束后能恢复到正确的位置执行。这块内存也被称为"线程私有"的内存。如果调用的方法是native的,则寄存器不存储任何信息。
- 2. 栈 (Stack):JVM的栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的是当前线程中局部基本类型的变量(八种)、部分的返回结果以及Stack Frame,非基本类型的对象(引用类型)在JVM栈上只存放一个指向堆内存的地址,因此Java中的基本类型变量采用值传递,而引用类型对象采用引用传递。由于栈是线程私有的,因此内存分配上非常高效,且当线程运行完毕后,这些内存也就被自动回收了。当栈请求深度大于允许的深度时,会抛出StackOverflowError的错误,可以通过-Xss来指定站的大小。而如果内存不足时,会抛出OutOfMemoryError错误。
- 3. 堆 (Heap):用来存储对象实例以及数组值,所有通过new创建的对象内存都在这里分配。堆中的对象内存需要等待GC(垃圾回收机制)进行回收,堆内存在32位操作系统上最大为2G,在64位操作系统上则没有限制,其大小通过-Xms(启动最小堆内存,默认物理内存的1/64,小于1G)和-Xmx(启动最大堆内存,默认物理内存的1/4)来控制。默认当空余堆内存小于40%时,JVM会增大堆的大小到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio来指定这个比例。当空余堆内存大于70%时,JVM会将堆内存的大小往-Xms指定的大小调整,可通过-XX:MaxHeapFreeRatio=来指定这个比例,但对于运行系统而言,为了避免频繁的改变堆内存的大小,通常都会将-Xms和-Xmx的值设置成一样。当堆中需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
- 4. 方法区域(MethodArea):在Java虚拟机规范中,方法区被描述为堆的一个逻辑部分,但一般与堆区分开。存放了加载的类信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,可见方法区域的重要性。同样,方法区域也是全局共享的,它在虚拟机启动时在一定的条件下也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小。
- 5. 运行时常量池(RuntimeConstant Pool):是方法区的一部分。类似C中的符号表,存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。类或接口的常量池在该类的class文件被java虚拟机成功装载时分配。
- 6. 本地方法堆栈(NativeMethod Stacks):与上述栈的作用非常相似,上述的栈主要为虚拟机执行Java方法(字节码文件)服务,而本地方法堆栈则是为Native方法服务。本地方法堆栈也会抛出StackOverflowError和OutOfMemoryError错误。
java内存空间简述的更多相关文章
- Java内存泄露简述
Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现. 本篇 ...
- java内存空间详解
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...
- java内存空间
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...
- Java内存管理简述
转自:http://www.codeceo.com/article/java-memory-area.html 一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据 ...
- Java内存空间的分配及回收
Java中内存分为: 栈:存放简单数据类型变量(值和变量名都存在栈中),存放引用数据类型的变量名以及它所指向的实例的首地址. 堆:存放引用数据类型的实例. Java的垃圾回收 由一个后台线程gc进行垃 ...
- java 内存空间
堆:new 出的对象在堆上 java栈:java程序.线程运行数据.内存数据 每个方法都有自己的栈.运行时需要的数据存在自己的栈中 每个线程对立的是图中浅蓝色的部分(java栈.本地方法栈.程序计数器 ...
- 【Java】关于JVM运行时内存空间、JVM垃圾回收机制
参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...
- 简述Java内存泄露
翻译人员: 铁锚翻译时间: 2013年11月4日原文链接: The Introduction of Memory Leaks内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Ja ...
- java中的内存空间 堆和栈
认识堆与栈 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过 ...
随机推荐
- Oracle表空间满处理方式
一.查询表空间常规语句 1.查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB ...
- 协议形式化安全分析 Scyther 并非所有协议可以照抄就搬
1.Scyther 形式化分析工具可以对协议进行形式化描述,验证协议的机密性和可认证性是否存在安全威胁.在攻击时支持会话轮数无限次执行,同时支持在强安全模型和Delov-Yao模型.在对要形式化分析的 ...
- JS基础篇【1】
该文讲解适用于有一定语言开发基础的朋友们,亦可当作久别重逢之回顾! 1.JS简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记 ...
- java.lang.AbstractMethodError: org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable
[转]https://stackoverflow.com/questions/53539930/java-lang-abstractmethoderror-org-powermock-api-mock ...
- artDialog提示框
API网址 http://aui.github.io/artDialog/doc/index.html 相关资料下载 https://code.google.com/archive/p/artdial ...
- python中赋值和浅拷贝与深拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- mysql 新手入门 官方文档+官方中文文档附地址
点评: 官方文档地址 官方中文文档地址 sql语句扩展
- linux下环境管理anaconda3
我之前在centos之安装单独python3.6,大家都知道centos自带python2.7,通过输入python,和python3来控制想要使用python2,或者python3,如今想要要在li ...
- CORS通信
CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨域的服务器,发出XMLHttpRequest请 ...
- JSOI2009 密码 和 JSOI2007 文本生成器 和 ZOJ3545 Rescue the Rabbit
密码 众所周知,密码在信息领域起到了不可估量的作用.对于普通的登陆口令,唯一的破解 方法就是暴力破解一逐个尝试所有可能的字母组合,但这是一项很耗时又容易被发现的工 作.所以,为了获取对方的登陆口令,在 ...