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

时间:2022-12-09 22:31:19

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

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

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

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

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

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

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

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

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

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

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

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

继续细化:

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

继续细化:

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

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

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

那虚拟机栈里面存放的是什么东东呢?其实它是存放每一个线程私有的东东,而每一个方法执行的时候都会存放一个栈帧,也就是虚拟机栈中存放的就是一个个栈帧,那栈帧里面存放的是啥东东呢?
java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解

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

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

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

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

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

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

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

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

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

也就是它:

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

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

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

那下面做如下实验:

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

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

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

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

Thread构造函数StackSize的使用:

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

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

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

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

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

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

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

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

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

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

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

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

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

java线程基础巩固---多线程与JVM内存结构的关系及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规范&gt ...

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

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

随机推荐

  1. WPF中弹出菜单

    在WPF里弹出菜单是用Popup,你那个右键的是上下文菜单(也就是快捷菜单). <Grid> <Button x:Name="BtnPop" Width=&quo ...

  2. DTcms列表隔行换色;loop自带行号

    <%loop cdr2 bcategoryList%> <%if(cdr2__loop__id==1)%> <a class="no-bg" href ...

  3. 00&lowbar;ForTest

    -----该页是爬虫的测试页请忽略------- 1234545@qq.comadasdsdasdsad阿打算多少其热情为 asdasdasdasd4w5wsdvv啊实打实大 啊实打实大asdasda ...

  4. ios数组基本用法和排序

    1.创建数组 // 创建一个空的数组 NSArray *array = [NSArray array]; // 创建有1个元素的数组 array = [NSArray arrayWithObject: ...

  5. Yii 控制dropdownlist &sol; select 控件的宽度和 option 的宽度

    默认情况下, option的宽度会由options中最宽的元素决定,并且同时决定着select控件的宽度 在Yii中,如果需要自定义select控件的宽度,可以用 htmlOptions定义,如下: ...

  6. Singular value decomposition

    SVD is a factorization of a real or complex matrix. It has many useful applications in signal proces ...

  7. 用PULL解析器解析XML文件

    第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputS ...

  8. try与except处理异常语句

    ji 简介 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测, ...

  9. js常用的工具函数

    JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...

  10. Xcode project 设置相关

    FauxPas 这是一款Mac平台的用于检查Xcode项目的辅助工具 ,可以帮助我们找出常见的错误.隐藏的bug.不良实践以及可维护性问题和风格问题. 一, $(SRCROOT)  :当前工程所在的目 ...