java的Thread所占内存是jvm中哪里的?

说到线程,我们往往想到的是线程安全、线程池,很少会去考虑线程的内存。
那么一个线程占用多大的内存?占用哪里的内存呢?

占多大的内存?

jdk1.4默认的单个线程是占用256k的内存
jdk1.5+默认的单个线程是占用1M的内存
可以通过-Xss参数设定,一般默认就好

占哪里的内存?

这TM还用问?java线程当然是占用jvm的内存啊!
好,我们做个实验,用jMeter同时并发调用java里某个接口200次,让java里增加大约190个线程(tomcat会有驻留线程,我这是10个),看下堆内存的情况:

从图中看到当线程猛增时,堆内存也猛增,然后堆内存会迅速下降,这是因为堆上new了大量的对象,所以猛增,然后线程执行完后,对象被GC了,所以下降。


上面提到堆内存下降是因为线程执行完了,GC回收了new出来的对象。但从图中看出,堆内存下降后线程数并没有下降,这是为什么呢?


用过线程池的都知道,线程执行完后并不会立即销毁掉,会有一个保活时间,保活时间过了后才会销毁,so我用的是jdk1.8,每个线程占用1M内存,如果是占用的堆内存,那堆内存应该会增加190M左右,但从图中看并没有,所以线程不是占用的堆内存空间。

实际上,java里每新起一个线程,jvm会向操作系统请求新起一个本地线程,此时操作系统会用空闲的内存空间来分配这个线程。所以java里线程并不会占用jvm的内存空间,而是会占用操作系统空闲的内存空间。


首先,jvm的几个变量要了解下:
-Xms 为jvm启动时分配的初始堆的大小,也是堆大小的最小值,比如-Xms200m,表示分配200M
-Xmx 为jvm运行过程中分配的最大堆内存,比如-Xmx500m,表示jvm进程最多只能够占用500M内存
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M

这附图中我们想到,Xss、堆内存、线程数三者是什么关系?

最后得出这样一个结论:
在java中每new一个线程,jvm都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。所以,线程占用的内存是堆外内存

这就明白了,当堆内存(受Xms和Xmx控制)越大,整个电脑内存所剩余的内存就越小。
而线程栈Xss是每创建一个线程,给该线程分配的内存值。所以:


线程开启需要占用的资源有哪些?

一、线程开启所占用的空间开销
【1】Thread内核数据占用:主要有OSID(线程的ID)和Context(存放CPU寄存器相关的资源)寄存器的状态会被保存到Context中,以便下次使用。因为子线程程序和主线程程序执行主要是依赖时间片切换(所以电脑使用中不会有卡顿情况)。通常系统分配一个时间片大约30ms,意思就是1秒中被分配至少33份,分别执行不同的线程。

【2】Thread环境块(了解)

【3】用户堆栈模式(主要部分):用户程序中的局部变量和参数传递所使用的堆栈,如果是引用类型则使用堆的空间,如果是值类型则使用栈的空间。例如在写程序中会遇到【StackOverFlowException异常:内存溢出】。典型的就是程序有死循环!不断占用堆栈空间,因为默认情况下:windows会分配1M的空间给用户模式堆栈(换句话说,一个线程分配1M的堆栈空间,用于局部变量和参数传递)

二、线程在时间的上的开销
【1】资源使用通知开销:一个程序开启通常会有很多资源调用,包括托管的,非托管的dll、exe、资源、元数据等。。。这些资源的启用都需要通知,通知是花时间的。

【2】时间片开销(主要部分):只要我们电脑的线程超过电脑的CPU处理器个数对应的线程,一定会有时间片切换。

 

————————————————

 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_67266787/article/details/124271545

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值