JVM的组成
JVM一共有五大区域,程序计数器、虚拟机栈、本地方法栈、Java堆、方法区。
程序计数器
程序技术器是一块很小的内存空间,由于Java是支持多线程的。当线程数大于CPU数量时,CPU会按照时间片轮寻执行每一个线程,当切换执行线程的时候程序计数器标记着当前线程的下一个指令。
各个线程之间的程序计数器互不影响,独立工作,是一块私有空间。如果当前线程执行的是Java方法则计数器存放着正在执行的Java字节码地址。如果当前线程执行的是Native方法则计数器为空。
Java虚拟机栈
Java虚拟机栈是一块线程私有空间,Java线程创建的时候而创建。
Java函数的调用需要使用栈,当调用层数很深的时候(递归)。栈的内存不够就会抛出StackOverFlow。动态扩展就是防止StackOverFlowError异常,当虚拟机空间不足以扩展时会抛OutOfMemoryError。
每调用一个方法,Java虚拟机栈中会生成一个栈帧,栈帧中一块最重要的区域是局部变量表。局部变量表中存着方法的参数和方法的局部变量,参数和局部变量越多栈帧所占空间越大。
修改Java虚拟机栈的大小可以设置-Xss参数。
存放:局部变量表,操作数栈,动态链接,即8种基本数据类型和对象的引用。
本地方法栈
本地方法栈和Java虚拟机栈功能很相似,Java栈用来管理Java方法的运行,而本地方法栈是用来管理本地方法的运行。本地方法并不是Java实现的,而是用C实现的。
也会有 StackOverflowError 和 OutOfMemoryError 异常。
Java堆
堆是一块共享的区域,Java运行过程中所有的对象和数组都存在堆中,Java堆内存分3块 新生代、年老代和永久代。新生代有分3块区域,Eden、Survivor space1、Survivor space2。三块区域的默认空间大小比例是8:1:1。新产生的对象放在Eden区,Survivor2块区域译为幸存区,也就是说Eden至少经历了一次GC到Survivor区,如果经历多次GC依然没有被回收掉的会有机会进入老年区。
方法区
方法区与堆区域类似,都是一块线程共享区域,存放着类的元信息 方法类型、常量池等,Java7之前方法区位于永久代(PermGen space),与堆相互隔离,JVM启动之前设置大小,启动之后大小不能再改变。当永久代的空间被占满之后,会抛异常OutOfMemoryError。Java8之后永久代被舍弃。取而代之的是元空间(Metaspace)。元空间位于本地内存,这样就不会被JVM的大小所限制。而且大小可以动态调配,减少OOM。Java8以后常量池被放到了堆空间中。
动态类加载会导致永久代的OOM。
在JDK1.7及以后,JVM已经将运行时常量池从方法区中移了出来,在JVM堆开辟了一块区域存放常量池。
方法区是JVM规范概念,而永久代则是Hotspot虚拟机对方法区的一个实现。
注:除了程序计数器之外都有可能发生内存溢出。
JVM的组成的更多相关文章
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- JVM类加载
JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...
- Java虚拟机 JVM
finalize();(不建议使用,代价高,不确定性大) 如果你在一个类中覆写了finalize()方法, 那么你可以在第一次被GC的时候,挽救一个你想挽救的对象,让其不被回收,但只能挽救一次. GC ...
- 在 Linux 中安装 Oracle JDK 8 以及 JVM 的类加载机制
参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...
- MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程
在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...
- java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)
尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- JVM虚拟机结构
JVM的主要结构如下图所示,图片引用自舒の随想日记. 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内 ...
随机推荐
- 关于unicode汉字范围正则表达式的写法
\u2E80-\u2EFF:CJK部首补充: \u2F00-\u2FDF:康熙部首: \u3000-\u303F:CJK标点符号: \u31C0-\u31EF:CJK笔划: \u3200-\u32FF ...
- 与项目欧拉速度比较:C vs Python与Erlang vs Haskell
我从问题#12 ProjectEuler作为编程练习,并比较我在C,Python,Erlang和Haskell中的实现(当然不是最优)实现.为了获得更高的执行时间,我搜索了第一个有1000个以上因子的 ...
- php--0与空的判断
使用empty()函数判断,两者都是true $a=0; if(trim($a)=="") { echo '数字0'; }
- Junit 单元测试在 intelliJ IDEA 中的安装
1.为什么使用Junit我们都知道,main 方法是一个程序的入口,通常来说,没有main方法,程序就无法运行.我们经常会写一些class文件(如下图所示),他们并没有自己的main方法.那么我们如何 ...
- dTree动态生成树(后台处理,简化前台操作)
dTree是个很方便在页面生成树的 js 控件,如果你下载了,我猜里在几分钟之内便能在页面上显示出一颗树来. 它本身给的例子是通过一些静态数据构造树,下面我说一种通过查询的数据动态构造树的方法. 例子 ...
- 批量修改datafram中某一列
如要对df中列名为“values”的值做修改,大于等于50改为1,小于50改为0,可用apply函数来实现: def fun(x): if x >= 50: return 1 else: ret ...
- Python如何让字典保持有序
问题: Python如何让字典保持有序 ? 解决方案: 使用collections.OrderedDict代替Dict. 验证程序: from collections import OrderedDi ...
- lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问
lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问,如果关闭防火墙虚拟IP就可以访问网站了,这个问题肯定是防火墙在作怪. 经过这两的不懈奋斗和大家的帮助 ...
- Django 学习笔记1-- URLconf
今天好像巴黎有点乱,希望明天太阳还会照常升起. 简介 Django 是一个由 Python 编写.开源并采用经典的 MVC 设计模式的 Web Full Stack 应用框架. 在 Django 中, ...
- 从租人APP沦为性工作发布平台 看共享经济监管边界
看共享经济监管边界" title="从租人APP沦为性工作发布平台 看共享经济监管边界"> 继直播类软件部分涉黄之后,最近火爆的各类"租人"软件 ...