继续学习一下Thread的构造函数,在上次【http://www.cnblogs.com/webor2006/p/7760422.html】已经对如下构造都已经学习过了:

多线程与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线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解的更多相关文章

  1. java的线程安全、单例模式、JVM内存结构等知识学习和整理

    知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...

  2. Java虚拟机(一):JVM内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  3. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  4. 转:JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  5. Java线程基础及多线程的实现

    一.进程和线程 1.进程:正在运行的程序         是系统进行资源分配和调用的独立单位         每一个进程都有它自己的内存空间和系统资源 2.线程是进程中的单个顺序控制流,是一条执行路径 ...

  6. java线程基础巩固---多线程死锁分析,案例介绍

    之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始: 首先新建两个类: 此时当然得到Oth ...

  7. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  8. java 面向对象(二):JVM内存结构

    编译完源程序以后,生成一个或多个字节码文件.我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行.意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析. <JVM规范> ...

  9. 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型

    原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...

随机推荐

  1. Visual Studio Code的设置及插件同步

    Visual Studio Code的设置及插件同步 使用Visual Studio Code开发有一段时间了,用起来是极其的顺手,但是唯独一点不爽的就是,Visual Studio Code不像Vi ...

  2. ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  3. PI膜热作用机理

    一.热分析法: 二.研究成果 1.PI膜热老化机理 实验条件:8根500w的碘钨灯加热,200倍光学显微镜观察,PI膜的技术指标 实验概述:本研究分别以150 ℃ ,  175 ℃ , 200 ℃ , ...

  4. 【VS开发】【Live555-rtsp】RTSP服务器实例live555源代码分析

    原文地址:RTSP服务器实例live555源代码分析作者:mozheer 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClient ...

  5. Linux 脚本

    1.理解Linux Shell和基本Shell脚本语言的小贴士(一) http://blog.jobbole.com/63952/ ------伯乐在线

  6. SGI STL源码stl_bvector.h分析

    前言 上篇文章讲了 STL vector 泛化版本的实现,其采用普通指针作为迭代器,可以接受任何类型的元素.但如果用来存储 bool 类型的数据,可以实现功能,但每一个 bool 占一个字节(byte ...

  7. 【Python】【demo实验20】【练习实例】【寻找“完数”】

    原题: 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. 我的代码: #!/usr/bin/python # encodi ...

  8. MySql查看时间

    select now();命令查看MySql时间(包括时分秒) select current_date();命令查看MySql时间(不包括时分秒) 在代码中,创建时间.修改时间字段的jdbc语句也可以 ...

  9. 怎样理解 Vue 组件中 data 必须为函数 ?

    组件意在 复用 , 若为 对象, 则会相互干扰. 且 Vue 不允许此事发生, 规定必须为函数, 否则报错. 原理如下 对象 // 模拟创建组件 var Component= function() { ...

  10. window.setInterval

    window.clearInterval与window.setInterval的用法 window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setI ...