java 内存, 类加载g
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的更多相关文章
- Java内存管理-掌握虚拟机类加载器(五)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载.连接(验证.准 ...
- Java内存管理-掌握虚拟机类加载机制(四)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域 ...
- java 虚拟机类加载 及内存结构
http://www.jb51.net/article/105920.htm https://www.cnblogs.com/Qian123/p/5707562.html Java类加载全过程 一个j ...
- 十七、java内存模型_JVM_JDK_类加载
1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的 ...
- Java 内存管理
java 内存管理机制 JAVA 内存管理总结 java 是如何管理内存的 Java 的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字 new 为 ...
- java内存管理机制
JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...
- Java内存是怎么管理的
JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...
- 介绍下Java内存区域(运行时数据区)
介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...
- 浅析java内存模型--JMM(Java Memory Model)
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...
随机推荐
- NBU 还原LINUX ORACLE RAC数据库(MIDDB)
MIDDB集群数据库恢复 目录 MIDDB集群数据库恢复... 1 1.安装 NBUcilent 1 2.修改hosts文件... 2 3.修改hosts文件... 2 4.使用bplis读取备份文件 ...
- vps vultr centos7 搭建 伟皮恩
vultr 配置 64 bit OS CentOS 7 ×64 20 GB SSD 1 CPU 512MB Memory 500GB Bandwidth √ Enable IPv6 √ ...
- 2017最新整理移动Web开发遇到的坑
随着前端的热度不断升温,行业对前端的要求越来越高:精准无误的实现UI设计,已成为前端职业更加精细化的一种表现:随着移动互联网的发展.WebApp似乎一种不可逾越的鸿沟:越来越多的企业开始趋势于轻量级的 ...
- python 进行机器学习
summary: 本文总结了几种常见的线性回归的的方式以及各种方式的优缺点. 1,简单现性回归(OSL): OSL:就是一种最为简单的普通最小二乘法的实现,y = a0 + a1*x1 + a2*x2 ...
- pta l2-10(排座位)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805066135879680 题意:给宴席排座位,有n个人,m个 ...
- 第十一章 串 (b2)蛮力匹配
- 第三章 列表(e)插入排序
- 像素 转换 px dp
public static int dip2px(Context context, float dpValue){ final float scale = context.getResources() ...
- oracle数据库导入导出问题
场景描述: 1.做一个从UAT到PRD的Schema迁移,UAT环境有sys用户,PRD环境没有sys用户,由于权限限制,没办法使用expdp/impdp,只好选择exp/imp命令: 2.UAT和P ...
- 【Linux 进程】exec族函数详解
exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **e ...