C语言内存模型的栈帧,java内存模型(线程独占部分)
线程独占部分
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内存模型(线程独占部分)相关推荐
- java内存 海子_Android 面试经验 - Java 内存模型 - Java 技术驿站-Java 技术驿站
Java内存模型 目录 Java执行流程 Java文件被编译成字节码文件之后,由JVM中的类加载器进行加载,加载完毕之后,交由JVM的执行引擎执行.在程序执行的过程中,JVM会用一段空间来存储数据和相 ...
- java if在内存中_全面理解Java内存模型
Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...
- java 及时释放内存_JMM(一):初识Java内存模型
在并发编程中,线程之间的通信是一个很关键的问题,而该问题解决方案主要可分为两大类:消息传递.共享内存.前者有以Erlang语言为代表的Actor模型,而后者中典型的则是Java语言.对于消息传递机制而 ...
- linux系统调用和内存管理以及栈帧
linux编程和C++笔记 目录 linux编程和C++笔记 0. terminal操作快捷键等 1. vfork的子进程return程序会挂掉,但exit不会 2. C++内存管理详解 3. 关于堆 ...
- 全面理解java内存模型_深入理解Java内存模型(八)——总结
处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...
- java内存模型浅析_浅析java内存模型
原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...
- java 内存模型6_深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...
- 内存分区与栈帧使用分析
转载自:https://blog.csdn.net/zhongguoren666/article/details/7586074 函数调用是程序设计中的重要环节,也是程序员应聘时常被问及的,本文就函数 ...
- java内存区域_JVM学习之—Java内存区域
为了加深对Java语言的理解,加深对Java虚拟机工作机制.底层特性的了解和掌握,准备在闲暇时间,抽空对<深入理解Java虚拟机 JVM高级特性与最佳实践>一书进行学习.本文是学习此书第2 ...
最新文章
- angular ajax get post 参数,Angular的Post 传递参数问题及解决方法
- jmeter mysql数据导出_Jmeter连接mysql
- 晨哥真有料丨为什么女生从来不主动找你聊天
- OneNote中到底能放多少种东西?
- 程序员有哪些丢不掉的编程“陋习”?
- 官网消息【iPlayer外挂字幕】功能开发中!有图
- H3C ipv6与ipv4(6to4)隧道实验
- JavaWeb之servlet详解(转帖)
- 刚学的一招呵呵,愚人节到了,教个大家最强的整人方法
- 教你快速识别网络项目的骗术
- 在腾讯云主机上搭建pytorch深度学习环境
- 入门级理财书-小狗钱钱-读书笔记
- UnityShader学习教程之<矩阵的左乘还是右乘所导致的效果问题>
- 力扣第四十六题(全排列)详解
- 基于单片机的升力检测仪系统设计
- Anaconda3、TensorFlow和keras简单安装方法(较详细)
- 如何合并svn分支到主干上
- 2022国赛中职网搭 windows组策略
- 五大移动GPU厂商论剑
- 计算机简史:所有这些时刻,终将流失在时光中,一如眼泪消失在雨里