作为一个java程序员 jvm 虚拟机应该是最先接触的了,但是当初由于理解能力有限一直没搞明白是怎么回事,而是将他理解为运行java程序的环境,不过这也没错。但是随着工作时间的增加开始思考jvm里面工作的原理一些机制了,也是面试中经常被问到的一个问题。所以今天也是在这里总结一下。

程序计数器

java 多线程执行都时因为它的存在,多线程是通过程序轮流切换处理器执行时间的方式来实现的,程序计数器可以保证每一个线程在切换后可以恢复到正确的执行位置。每个线程独立拥有自己的计数器,随线程的创建而创建随线程的销毁而销毁。当线程在执行Nativan方法时计数器为空,因为Nativan是C或者C++写的由系统控制。这块区域也是唯一不会抛出内存溢出的内存空间。

本地方法栈

与虚拟机方法栈相同,因为java中好多方法是用C或者C++实现的。本地方法栈也就是在执行这些方法时而创建。

虚拟机栈:

虚拟机栈也是平时我们所说的java栈,线程创建的时候Jvm会为其分配一个方法栈。Java栈以多个栈帧组成,每个栈帧其实也代表一个方法一个线程中调用了多少个方法可以理解为有多个栈帧(虚拟机并不是将所有的栈创建完成在统一执行该线程) 线程在执行某个方法的时候首先会从方法区中加载该方法的信息并创建一个栈帧并执行压栈操作将当前栈放在栈顶,如果该方法也掉用了其他方法,依次执行以上操作并将父栈压到下一栈。当该栈帧执行完成或者抛出异常后将自动出栈第二栈成为栈顶并执行依次将所有的栈帧执行完毕表示该现在执行完毕销毁这个栈。方法栈不需要GC回收,在整个栈销毁的时候资源都会被释放。当栈的深度达到虚拟机配置的深度时 会抛出 StackOverflowError。这个参数可以用 -Xss128k 来设置,需要注意的是只有在初始化一个栈的时候然后申请不到内存的时候才会抛出 OutOfMemoryError

方法区:

在Jvm加载class 文件的时候会将class磁盘信息加载到内存中 其中方法区包括,类型信息,类型的常量池,字段信息,方法信息,类变量,指向类加载器的引用,方法表。这块区域是所有线程共享的操作的时候需要考虑线程安全问题举个例子:在某个类需要引用某个类的时候发现这个类还没有被加载这时开始加载但是需要保证这个类当前只有一个类加载器在执行(详情了解类加载机制)。 方法区虽然变动很小 但是也是需要GC来回收的。因为常量池中的数据大部分是线程在运行是创建的一些基本数据这些数据也会成为垃圾,全局变量不会被清除。

堆:

堆内存也是GC重点关照的区域,这块区域是可以动态扩展的,只要没有超过配置的的对内存大小就可以,每次在new 一个对象或通过反射一个对象的时候都从方法区中找到类的一些信息然后申请足够的内存在初始化这些类的信息,但是这次初始化不包括静态变量因为静态变量在第一次由虚拟机已经初始化完成。每次在创建子类的时候都需要都需要首先创建其父类,然后将这些引用地址放在栈中,而栈在销毁的时候这些地址就没有地方引用就变成了游离态,GC 做的事就是删除这些游离的数据。(GC按照什么机制来删除这些内存的下次详谈)。

总结:

我说说我刚开始是怎么记这些内容的不一定合理但是能方便记忆:

    1. 堆内存好比好比所有数据的集合
    2. 栈内存也就是一个个线程,他们实际不存在数据他们做的是按照某种规则排序算法来处理堆中的数据。
    3. 方法区就是好比一个超大的常量池,好多数据都需要从方法区中获取。
    4. 计数器可以理解为 CPU 底层的调度器。

java内存模型深入理解的更多相关文章

  1. java 内存模型的理解

    之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...

  2. java内存模型JMM理解整理

    什么是JMM JMM即为JAVA 内存模型(java memory model).因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且 ...

  3. java内存模型个人理解总结

    现阶段线程之间的通讯主要有两种:内存共享和消息传递,而且在java中是采用的内存共享.简单说下内存共享: 假设现在有a线程和b线程,在a和b线程之间的通讯是依靠a线程将相关数据刷新到共享内存,然后b线 ...

  4. 全面理解Java内存模型(JMM)及volatile关键字(转载)

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...

  5. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  6. 全面理解Java内存模型(JMM)及volatile关键字(转)

    原文地址:全面理解Java内存模型(JMM)及volatile关键字 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型( ...

  7. java内存模型原理阅读总结

    Java内存模型可以理解为在特定操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象.不同架构的物理计算机可以有不一样的内存模型,java虚拟机也有自己的内存模型,java虚拟机规范中试图定义一种 ...

  8. 并发之初章Java内存模型

    >>>>>>博客地址<<<<<< >>>>>>首发博客<<<<< ...

  9. 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

    Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...

随机推荐

  1. 【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历

    题目 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, ...

  2. C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议

    通俗点说,挂片协议可以看作整个系统的一个相对复杂一点的配置文件,可以用JSON或XML格式来读取与保存, 另外,可以制作一个独立的exe配置程序来管理这些挂片协议. 假设配置了CT的挂片协议的右键菜单 ...

  3. JDK15正式发布,新增功能预览!

    JDK 15 在 2020 年 9 月 15 号正式发布了,这次发布的主要功能有: JEP 339:EdDSA 数字签名算法 JEP 360:密封类(预览) JEP 371:隐藏类 JEP 372:删 ...

  4. C# 中 Struct 和 Class 的区别总结

    翻译自 Manju lata Yadav 2019年6月2日 的博文 <Difference Between Struct And Class In C#>,补充了一些内容和示例. 结构体 ...

  5. python中圆周率的计算

    蒙特卡罗方法计算圆周率 蒙特卡罗方法是一个撒点方法,取一个正圆的四分之一,和一个正方形的四分之一 形成一个单位方形,单位四分之一圆和四分之一正方形之比,就构成了圆周率 向这个区域撒点,如果点落在圆内部 ...

  6. 理解Java中的final关键字

    final关键字的基本用法 1. 修饰类 出于安全考虑,类无法被继承 2. 修饰方法 防止继承类修改方法private方法会隐式指定为final方法: 3. 修饰变量 基本数据类型,初始化后不能再修改 ...

  7. Class对象、反射、动态代理

    Class对象是所有类的根源,Object是所有对象的根源. 编译后的新类会产生一个Class对象,保存在同名的.class文件中.每个类都有一个Class对象,它包含了所有的与类有关的信息.所有的C ...

  8. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

  9. 刷题[WUSTCTF2020]CV Maker

    解题思路 好家伙,打开一看像是cms,又看名字CV Maker.我以为直接要搜cve打了.搜了一会发现没什么啊.那先正常做把. 注册 注册成功后这里报错,猜测可能有注入点.先放在这里,继续登陆.发现是 ...

  10. pycharm安装注意

    在安装pycharm时,一定要先去官网下载安装python新版. 安装python时候一定要选择自己熟悉的路径 在pycharm创建项目时编译器选择versions/3.8/bin/python3,这 ...