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语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...
随机推荐
- mybatis 插入返回自增后的id
//serviceImpl int customerId = customerDao.insertDynamic(customer1); System.out.println("id==== ...
- 解决在linux环境安装setuptools的相关错误
RuntimeError: Compression requires the (missing) zlib module 缺少zlib包 解决方案 yum install zlib yum i ...
- (django1.10)访问url报错Forbidden (CSRF cookie not set.): xxx
问题:页面访问时报错 Forbidden (CSRF cookie not set.): xxx 解决方法: 修改settings.py文件,注释掉 django.middleware.csr ...
- I/O复用之select
作用: 实现I/O的多路复用 该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生时或经历一段指定的时间后才唤醒它.进程将于select处阻塞,直到被检测的描述符有一个或多个 ...
- hibench 对CDH5.13.1进行基准测试(测试项目hadoop\spark\)HDFS作HA高可靠性
使用CDH 5.13.1部署了HADOOP集群之后,需要进行基准性能测试. 一.hibench 安装 1.安装位置要求. 因为是全量安装,其中有SPARK的测试(SPARK2.0). 安装位置在SPA ...
- Nginx 到底可以做什么
本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言交流. Nginx能做什么 反向 ...
- f5基本介绍
1.信息查看 1)登录: https://10.160.100.10 f5有2台,做HA IP地址分别为10.160.100.3和10.160.100.2 10.160.100.10为虚拟地址 2)基 ...
- nginx: [emerg] mkdir() "/var/temp/nginx/client" failed (2: No such file or directory)
报错信息 [root@bogon sbin]# ./nginx nginx: [emerg] mkdir() : No such file or directory) 解决方法 [root@bogon ...
- SAP请求号的传输
SAP传输目的: SAP传输目的是把开发机中的程序或对象传输到对应的测试机或生成机中,保持各系统的同步性,方便测试和最后的部署! SAP求情号传输的步骤: 1.创建一个请求号 2.用SE10进入如下界 ...
- samrty模板变量操作符
count_sentences [计算句数],示例:{$smarty.get.name|count_sentences} count_words [计算词数],示例:{$smarty.get.name ...