线程独占部分

1、你了解Java的内存模型吗?

内存简介

有内核空间、用户空间(java是运行在用户空间上)

32位系统---》最大的访问内存大小是4G

62位系统---》最大的访问内存大小是512G

背景:

我都知道C语言下,通常将内存划分位数据段和代码段

数据段包括堆、栈、以及静态数据区

JVM内存模型--JDK8

从线程的角度去看

线程私有:程序计数器、虚拟机栈、本地方法栈(问虚拟机栈和本地方法栈的区别)

线程共享的:元空间(metaSpace,类加载信息 OOM) 堆---》包括(常量池-->字面量和符合引用量)和数组、类对象 OOM

程序计数器:

1、当前线程所执行的字节码行号指示器(逻辑)

2、改变计数器的值来选取下一条需要执行的字节码指令(分支,循环,跳转,异常处理,线程恢复)

3、和线程是一对一的关系即“线程私有”

4、对Java方法计数,如果是Native方法则计数器值位Undifined

5、不会发生内存泄漏

Java虚拟机栈(Stack)

1、Java方法执行的内存模型

2、包含多个栈帧(包含、局部变量表、操作栈、动态链接、返回地址)

局部变量表和操作数栈的关系是什么?

---》局部变量表:包含方法执行过程中的所有变量(boolen ,char,long,short ,int ,float,double ...)

操作数栈:入栈、出栈、复制、交换、产生消费变量(加减乘除的地方)

局部变量表的数据会压入到操作数栈中,而操作数栈会进行计数,根据指令返回已计算好的数

递归为什么会引发java.lang.StackOverflowError异常?

-----》因为当线程执行一个方法时会创建出一个栈帧,并将栈帧压入到虚拟机栈中,当方法执行完毕的时候,就会将栈帧出栈。因此可知,当前线程所执行方法对应的栈帧必定位于虚拟机栈的顶部,

第一,我们的递归不断调用自身,每调用一次就生成一个栈帧,

第二,它会保存当前栈帧的状态,将它保存到虚拟机栈中,

第三,栈帧上下文切换的时候,会切换到最新的方法栈帧中。

由于递归过深,栈帧数超出虚拟机栈深度,就会报java.lang.StackOverflowError

解决这个问题的方法是:1、限制递归的深度。2、用循环来替代递归

虚拟机栈过多会引发 java.lang.OutOfMeoryError 异常?

会的,

public void a(){

while(true){

new Thread(){

public void run(){

while(true){}

}}}}

栈帧的内存是不需要通过GC去回收的,是会自动释放,是为什么呢?

---》因为调用方法的时候创建栈帧,调用完毕栈帧就会自动出栈。

本地方法栈

1、与虚拟机栈相似,主要作用域标注了native的方法(用native去修饰的方法,是用本地方法栈的,例如:forName0方法)

程序计数器---》

额外知识:

内存泄漏和内存溢出的区别?

---》内存溢出就是程序申请内存时,没足够的内存空间被使用。

内存泄漏是内存被程序占用了,不释放出来,导致剩余的内存越来越少。

C语言内存模型的栈帧,java内存模型(线程独占部分)相关推荐

  1. java内存 海子_Android 面试经验 - Java 内存模型 - Java 技术驿站-Java 技术驿站

    Java内存模型 目录 Java执行流程 Java文件被编译成字节码文件之后,由JVM中的类加载器进行加载,加载完毕之后,交由JVM的执行引擎执行.在程序执行的过程中,JVM会用一段空间来存储数据和相 ...

  2. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

  3. java 及时释放内存_JMM(一):初识Java内存模型

    在并发编程中,线程之间的通信是一个很关键的问题,而该问题解决方案主要可分为两大类:消息传递.共享内存.前者有以Erlang语言为代表的Actor模型,而后者中典型的则是Java语言.对于消息传递机制而 ...

  4. linux系统调用和内存管理以及栈帧

    linux编程和C++笔记 目录 linux编程和C++笔记 0. terminal操作快捷键等 1. vfork的子进程return程序会挂掉,但exit不会 2. C++内存管理详解 3. 关于堆 ...

  5. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  6. java内存模型浅析_浅析java内存模型

    原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...

  7. java 内存模型6_深入理解Java内存模型(六)——final

    与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...

  8. 内存分区与栈帧使用分析

    转载自:https://blog.csdn.net/zhongguoren666/article/details/7586074 函数调用是程序设计中的重要环节,也是程序员应聘时常被问及的,本文就函数 ...

  9. java内存区域_JVM学习之—Java内存区域

    为了加深对Java语言的理解,加深对Java虚拟机工作机制.底层特性的了解和掌握,准备在闲暇时间,抽空对<深入理解Java虚拟机 JVM高级特性与最佳实践>一书进行学习.本文是学习此书第2 ...

最新文章

  1. 史上最全的git 常用命令集合
  2. 脑机综述(一) | 脑机接口在康复医学中的应用进展
  3. iOS开展block说明
  4. [JavaWeb基础] 025.JAVA把word转换成html
  5. 用boost.signal实现多播委托
  6. SAP Spartacus CurrentProductService.getProduct方法的实现原理
  7. 1031. 查验身份证(15)
  8. c++ winpcap开发(9)
  9. oracle 不能导入sql语句,oracle数据库导入.dmp脚本的sql 语句
  10. 微课|中学生可以这样学Python(例7.2):三维向量类
  11. .net mvc + layui做图片上传(二)—— 使用流上传和下载图片
  12. 洛奇英雄传单机版服务器未响应,洛奇英雄传官方网站
  13. javascript高级程序设计读书笔记——事件总结
  14. 卡方拟合优度检验(非参)
  15. 微型计算机原理与接口技术 教案,微机原理与接口技术课程教与学(教学大纲)...
  16. Python多字段排序之cmp_to_key详解
  17. CVPR 2021 Exploring Simple Siamese Representation Learning
  18. 复制整个文件夹下的文件(无限递归复制子文件夹)
  19. effective c++ 23NVI手法
  20. in作为介词的用法_介词in,on,at的具体用法与区分

热门文章

  1. 循环神经网络(LSTM和GRU)(1)
  2. Java多线程——同步容器类
  3. JAVA设计模式(08):结构化-飞锤(Flyweight)
  4. Android ListView中EditView再次焦点获取
  5. ADO.NET编程(4)根据条件查询DataTable的值
  6. 模仿豆丁、百度文库播放器
  7. HDU2110 Crisis of HDU【母函数】
  8. Bailian3245 空调排名【水题】
  9. UVA12602 Nice Licence Plates【进制】
  10. JSK-27321 统计单词数【字符串】