线程独占部分

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方法)

程序计数器---》

额外知识:

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

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

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

java内存模型(线程独占部分)的更多相关文章

  1. 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解

    众所周知,i++分为三步: 1. 读取i的值 2. 计算i+1 3. 将计算出i+1赋给i 可以使用锁来保持操作的原子性和变量可见性,用volatile保持值的可见性和操作顺序性: 从一个小例子引发的 ...

  2. java线程内存模型,线程、工作内存、主内存

    转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...

  3. java内存模型与线程(转) good

    java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...

  4. JAVA内存模型与线程

    概述 由于计算机的运算速度和它的存储和通讯子系统的速度差距巨大,大部分时间都花在IO,网络和数据库上.为了压榨CPU的运算能力,需要并发.另外,优秀的并发程序对于提高服务器的TPS有重要的意义. 硬件 ...

  5. Java内存模型与Java线程实现原理

    硬件的效率与一致性 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为引入了一个新问题:缓存一致性. 在多处理器系统中,每个处理器都有自己的高速缓存, ...

  6. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

  7. 第十二章 Java内存模型与线程

    Java内存模型(Java Memory Model,JMM): 主内存与工作内存:Java内存模型主要是定义程序中各个变量的访问规则.Java内存模型规定了所有的变量都存储在主内存(Main Mem ...

  8. 【JVM.11】Java内存模型与线程

    鲁迅曾经说过“并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类‘压榨‘ 计算机运行能力的最有力武器.” 一.概述 多任务处理在现代计算机操作系统中几乎已 ...

  9. 多线程系列八:线程安全、Java内存模型(JMM)、底层实现原理

    一.线程安全 1.  怎样让多线程下的类安全起来 无状态.加锁.让类不可变.栈封闭.安全的发布对象 2. 死锁 2.1 死锁概念及解决死锁的原则 一定发生在多个线程争夺多个资源里的情况下,发生的原因是 ...

  10. 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程

    Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...

随机推荐

  1. 利用jenkins和docker实现持续交付

    利用jenkins和docker实现持续交付 一.什么是持续交付 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定.持续的保持在随时可以发布的状况.它的目标在于让软件的构建.测试与发布变得更 ...

  2. LuoguP3121 [USACO15FEB]审查(黄金)Censoring (Gold)【Hash做法】By cellur925

    题目传送门 其实这题正解是AC自动机的,字符串哈希吸氧才能过的,但是我太菜了不会...只能先用哈希苟了. 在扫描单词的时候首先把各个单词的哈希值和长度存起来.然后按照长度从小到大将各单词排序.而那个长 ...

  3. pycharm 添加个人信息

    2. 可以使用搜索快速找到"File and Code Templates", 右侧菜单选择"Python Script",对模板进行编辑 格式为: ${< ...

  4. 从输入url到浏览器显示页面的过程

    总体来说有两个大的方面: 一.网络通信连接部分.二.页面渲染展示部分. 细分详细过程: (网络通信) 1.输入url. 2.DNS解析域名. 3.拿到IP地址后,浏览器向服务器建立tcp连接. 4.浏 ...

  5. scikit-learning API

    API参考 这是scikit学习的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以给出其使用的完整指导. sklearn.base:基类和效用函数 所有估计器的基类. ...

  6. 洛谷 P3768 简单的数学题

    https://www.luogu.org/problemnew/show/P3768 化简一下式子,就是$\sum_{d=1}^ncalc(d)d^2\varphi(d)$ 其中$calc(d)=\ ...

  7. Minimal string CodeForces - 797C

    Minimal string CodeForces - 797C 题意:有一个字符串s和空串t和u,每次操作可以将s的第一个字符取出并删除然后放到t的最后,或者将t的最后一个字符取出并删除然后放到u的 ...

  8. 初探Hibernate3源码--读取配置文件

    依照个人推测,要实现ORM框架,关键是如何拼凑sql语句再通过jdbc来进行对数据库的访问,另外将数据库返回的数据记录封装成对应的类也是必不可少的. 那么实现ORM框架的基本思路如下: 1,读取xml ...

  9. 转--v$session & v$process各字段的说明【转载】

    Oracle 动态性能表 v$session & v$process 整理自google出来的网络资源.google是个好东东.没有google我会心神不宁. v$session SADDR: ...

  10. JS内置对象练习(慕课网题目)

    效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学 ...