1. java 内存区域

方法区 虚拟机栈 本地方法栈
程序计数器

    其中 :  方法区  和 堆 是所有线程共享的 , 其他是线程隔离的

    1.  程序计数器 : 可以看做是当前线程所执行的字节码的行号指示器。 字节码解释器在工作时通过改变这个计数器来选取下一条需要执行的字节码指令。

            由于java 的多线程是通过线程轮流切换来分配处理器执行时间的方式来实现的,所以在任何一个时刻,一个处理器只会执行一个线程中的指令,  

            所以,为了在线程切换后能够找到正确的字节码执行位置,所以每个线程都有一个独立的程序计数器。所有程序计数器是线程私有的。。

            该内存是唯一一个在java 虚拟机规范中没有规定OOM 异常的区域。。

    2. 虚拟机栈:是线程私有的,生命周期和线程相同。 虚拟机栈描述的是java 方法执行的内存模型 : 每个方法在执行时都会创建一个栈帧,用于存储

           局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的调用过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

           局部变量表: 存放编译器可知的各种基本类型(boolean,byte ,char ,short ,int ,long ,float ,double)、对象引用、returnAddress(指向一条字节码命令的地址)。

               其中long和double占用两个局部变量空间,其他占一个。 局部变量表所需内存空间在编译期期间完成分配。

           可能产生 stackoverflow(栈深度太大) 和 OOM

虚拟机栈 一个栈帧 局部变量表(基本类型,对象引用,returnAddress)
操作数栈
动态链接
方法出口
一个栈帧  

    3. 本地方法栈: 与虚拟机栈的区别是 ,虚拟机栈是为执行java 方法服务的,而本地方法栈则是为使用native 方法服务。

    

    4. 堆 :  存放所有的对象实例和数组, 可以通过xms 和 xmx 扩展大小。所有线程共享

    5. 方法区: 线程共享。 用于存储已被虚拟机加载的类信息,类常量,类静态变量    (注意和栈的不同,方法区是相对类的),即时编译器编译后的代码。

          类信息:类的版本,字段,方法,接口等描述信息外,还有一项信息常量池。

                常量池:用于存放编译期(注意是编译期,比如 String s = "a"+k(k=“bc”或者k=new String("bc")) 和 String s1= "abc" 是不相等的)生成的各种字面量和符号引用。这部分内容将在类加载后进入方法区的运行时常量池。

      问题 :  栈中局部变量表 和 方法区的运行时常量池到底怎么区分? 参考 https://blog.csdn.net/xing930408/article/details/74090641

局部变量表(基本类型,对象引用,returnAddress)
用于存放编译器生成的各种字面量和符号引用

            问题的关键是怎么理解基本类型和各种字面量

              带final的基础类型和String类型并且用常量表达式初始化的才算字面量,其他的都不是。

              比如 int a=1存放在栈中,因为这个不是常量

          

java 内存, 类加载g的更多相关文章

  1. Java内存管理-掌握虚拟机类加载器(五)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载.连接(验证.准 ...

  2. Java内存管理-掌握虚拟机类加载机制(四)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域 ...

  3. java 虚拟机类加载 及内存结构

    http://www.jb51.net/article/105920.htm https://www.cnblogs.com/Qian123/p/5707562.html Java类加载全过程 一个j ...

  4. 十七、java内存模型_JVM_JDK_类加载

    1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的 ...

  5. Java 内存管理

    java 内存管理机制 JAVA 内存管理总结 java 是如何管理内存的 Java 的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字 new 为 ...

  6. java内存管理机制

    JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...

  7. Java内存是怎么管理的

    JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...

  8. 介绍下Java内存区域(运行时数据区)

    介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...

  9. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

随机推荐

  1. 生成Release apk

    [生成Release apk] 1.使用Java SDK中的keytool生成keystore. Java SDK一般位于:C:\Program Files\Java\jdkx.x.x_x\bin. ...

  2. SQLMAP自动注入(二)

    --data 添加post头 --data 添加get头 --cookie 添加cookie 设置探测级别大于等于2时会探测cookie是否有注入点 --random-agent 随机生成user-a ...

  3. django models实际操作中遇到的一些问题

    问题1.将主键id改成自动生成的python3 manage.py migrate时报下面的错误 django.db.utils.InternalError: (1091, "Can't D ...

  4. 第十章 优先级队列 (b1)完全二叉堆:结构

  5. 缩点+最小路径覆盖 hdu 3861

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题意:输入t,表示t个样例.接下来每个样例第一行有两个数n,m表示点数和有向边的数量,接下来输入 ...

  6. [Java学习]面向对象-类的继承;方法覆盖

    一.类的继承 实现方法: public Class SubClass extends SuperClass{ } 继承最基本作用: 代码重用. 继承最重要的作用: 方法可以重写. 关于类的继承: 子类 ...

  7. f5 2017.09.03故障

    1.下午14点50左右有同事反应epm等系统登录有问题.自测登录也是有同样的报错. 2.测试发现内部IP直接访问正常,但是访问f5的vip的方式访问不了.此时oa.邮件等系统也开始有同事发现故障. 3 ...

  8. Word打开时显示*模板*,删除模板

    XP系统, 找到目录 C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates 删除里面的模板文件即可

  9. 在Struts2框架中使用Servlet的API

    1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的 ...

  10. mysql 安装后出现 10061错误

    #服务器端  提示 The vervice already exists! The current server installed #mysqld 服务没有启动 解决办法 移除原来的mysql服务  ...