多线程与JVM内存结构的关系【了解】:

对于最后一个有疑问的构造中stackSize参数,其实学过编程滴人从参数字面就比较容易理解,栈大小嘛,这里从官方文档上来了解一下这个参数:

而之前在学习java的时候基本上都是把jvm内存结构简单理解成一个栈区、一个堆区,其实要更好的理解这个stackSize,其实需要更细致的了解一下jvm的内存结构,所以在动手做实验之前先来把理论夯实下基础更细致的了解一下JVM内存结构,下面以图的方式来展开:

还是从我们耳濡目染的堆栈大类开始:

不多解释,下面来慢慢细化它里面的内容:

其中这部分区域是线程共享的区域,对应代码理解:

继续细化:

继续细化:

接着就要引来重点讨论的区域了【上图中故意在栈区上留了一个空缺就是用来说明它滴~~】:

那虚拟机栈里面存放的是什么东东呢?其实它是存放每一个线程私有的东东,而每一个方法执行的时候都会存放一个栈帧,也就是虚拟机栈中存放的就是一个个栈帧,那栈帧里面存放的是啥东东呢?

下面再来对照代码来理解:

而对于线程中会有执行native方法:

所以它就存放在本地方法区,如下:

而在执行了main函数就会创建一个栈帧,这里在main函数中定义一个变量,如下:

也就是它:

说了这么多理论其实就是为了理解虚拟机栈的概念,对于JVM的内存结构不用太过纠结,说实话实在太抽象了,重点是为了理解虚拟机栈,因为Thread的构造中的StackSize就是针对它而存在的,有了这些理论之后准备做一个比较关键的实验啦,但是在做实验之前还得强调一个概念,如下:

那下面做如下实验:

从内存角度来分析一下代码:很明显只有递归调用,没有方法返回,也就是从栈帧中的"操作栈"来说,只有入栈,并没有出栈,而每调用一个方法就会在虚拟机栈中创建一个栈帧,那实际上会撑爆虚拟机栈,很明显这个程序会报我们实际开发中比较常见的error啦,如下:

那有了这个实验跟Thread的stackSize参数有啥关系么?当然有,而且关系是大大滴,下面就来回到正题来探究下Thread构造函数stackSize的作用吧。

Thread构造函数StackSize的使用:

先再来看下JDK对它的介绍:

而刚才我们在main函数中去执行的递归由于是在JVM创建的main线程中执行的,那也就是无法咱们自己来定义这个stackSize,那将这个调用放到咱们自己定义的线程中呢,如下:

那这时我们尝试去改变这个栈的大小:

目前程序是运行的mac上的,说明在mac平台上给thread传stackSize是能起到一定的作用的,所以关于Thread的这个构造就了解了。

最后再来思考一下,如果不给Thread传stackSize,那它的栈大写是多少呢,查看一下源码:

而奇怪的是这个参数并没有被Thread中的类似地方使用到它,所以有可能是被底层c++给使用了。

所以对于Thread这个stackSize可以进行如下总结:

构造Thread的时候传入stackSize代表着该线程占用的stack大小,如果没有指定stackSize的大小,默认是0,0代表着会忽略该参数,该参数会被JNI函数去使用,另外一个需要注意:该参数在一些平台有效,在有些平台则无效,所以平常要去设置stackSize一般通过jvm的参数-Xss10M(将虚拟机栈的大小写设置为10M),而不去通过线程的这个stackSize。

java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...相关推荐

  1. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源

    线程生命周期 线程状态 New: 线程创建(new Thread()) Runnable: 线程可运行(thread.start()), 注: 调用start并不一定是运行状态, 可能在等待CPU调度 ...

  2. arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理

    java技术总结 知其然,不知其所以然 !在技术的海洋里,遨游! 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本篇以一些问题开头,请先不看答案,自己思考一下,看一下你 ...

  3. java+向前进一_Java 线程基础

    前言 线程并发系列文章: 熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性.操作的原子性,进而扩展出的Volatile.锁(CAS/Synchr ...

  4. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  5. mysql服务器多线程模型_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码 - 陈彦斌 - 博客园...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  6. 线程基础,多线程架构,高并发,线程安全基础知识

    线程基础,多线程架构,高并发,线程安全基础知识 线程基础 一.线程安全 1.1概念:当多个线程访问某一个类(对象或者方法)时,这个类始终都能表现出正确额行为,那么这个类(对象或者方法)就是线程安全的. ...

  7. .NET异步和多线程系列(四)- 多线程异常处理、线程取消、多线程的临时变量问题、线程安全和锁lock

    本文是.NET异步和多线程系列第四章,主要介绍的是多线程异常处理.线程取消.多线程的临时变量问题.线程安全和锁lock等. 一.多线程异常处理 多线程里面抛出的异常,会终结当前线程,但是不会影响别的线 ...

  8. Java 内存模型和 JVM 内存结构真不是一回事

    这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...

  9. 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

    现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...

最新文章

  1. 2017计算机nit考试时间,关于2017年专接本NIT考试,你知道多少呢???
  2. php url模式在哪修改,php如何修改url
  3. 如何实现每个周期4个FLOP的理论最大值?
  4. Linux C编程--网络编程2--面向连接的网络编程
  5. java swing刷新_Swing界面刷新问题(转)
  6. 利用bootstraptable展示数据,对数据进行排序分页等操作
  7. mysql mgr bug_Mysql MGR架构误操作引发的问题处理
  8. WCF Testing Tool(转)
  9. 开发中常用到的通用 scss 模块
  10. Vertica DBD 分析优化设计
  11. css样式,后代选择器
  12. 弹性系数和线径的计算公式_压缩弹簧的弹性系数计算
  13. excel不同文件表格批量加表头vba_用Excel VBA实现多文件夹内文件加入表头 遍历文件...
  14. 讨论小程序游戏开发用什么好?
  15. 提交代码到gitbub.com
  16. Mentor Expedition如何极坐标旋转添加器件?
  17. 程序员准备跳槽了,如何选择下一家IT公司?
  18. oracle判断数据是否存在吗_oracle数据库判断表是否存在,存在删除,并创建新表...
  19. 基于深度学习的汽车行业评论文本的情感分析
  20. C# 关联启动外部程序,监听程序是否运行

热门文章

  1. BERT模型实战之多文本分类(附源码)
  2. java基于ssm的个人博客系统_一个基于 Spring Boot 的开源免费博客系统
  3. 平台卖家要不要做独立站?
  4. html全屏banner轮播代码,基于jquery实现全屏banner自动轮播切换
  5. C++中字符串转换函数to_string
  6. 吴恩达机器学习 2.矩阵和向量知识
  7. Redis基础(八)——集群
  8. [python]No module named ‘bs4‘
  9. MySQL 日期时间相关函数
  10. WPF在代码中创建DataTemplate时候的异常