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. XSS和CSRF的区别

    XSS:攻击者发现XSS漏洞 => 构造代码 => 发送给受害者 => 攻击者获取受害者的cookie => 完成攻击 CSRF:攻击者发现CSRF漏洞 => 构造代码 ...

  2. 665. Non-decreasing Array

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  3. 在window下搭建Vue.Js开发环境(转)

    nodejs官网http://nodejs.cn/下载安装包,无特殊要求可本地傻瓜式安装,这里选择2017-5-2发布的 v6.10.3 cmd命令行: node -v //显示node版本 v6.1 ...

  4. win10 安装php

    缺失:msvcp110.dll https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679

  5. 树的子结构(python)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) # -*- coding:utf-8 -*- # class TreeNode: # def __ ...

  6. ceph 维护之 osd节点添加

    一.目标 添加一台新osd 节点,主机名ceph6 到 ceph 集群.public IP:10.6.32.25      cluster_network :10.6.33.25 二.基础环境配置 1 ...

  7. slf4j + log4j 需要的依赖

    正确的依赖 <!-- slf4j 依赖包 --> <dependency> <groupId>org.slf4j</groupId> <artif ...

  8. 【转】 UI自动化测试的关注点

    我发现了,大家极度关心自动化测试,尤其是UI自动化测试,虽然现在作为专项测试,离开这些越来越远了,但总能遥想以前,我总能想起自己做nokia的WindowsLive的ui自动化,做web的自动化测试, ...

  9. Angular之特性模块 ( Feature Module )

    项目结构 一 创建特性模块,及其包含的组件.服务. ng g module art ng g component art/music ng g component art/dance ng g ser ...

  10. java虚拟机的原理

    所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,Visual Box .Vmare就属于系统虚拟机.他们完全是对物理计算机的仿真 ...