java线程占多大的内存,占哪里的内存?

摘要:
jdk1.4的默认单线程使用256k内存。jdk1.5+默认单线程使用1M内存。可以通过-Xss参数进行设置。通常,默认内存在哪里?任何使用过线程池的人都知道,线程不会在执行后立即被销毁。将有一个保留时间,并且在保留时间结束后将被销毁。所以我使用jdk1.8,每个线程占用1M内存。如果它被占用了堆内存,那么堆内存应该向左和向右增加190M,但从图中看不到,因此线程没有被占用堆内存空间。因此,Java中的线程不会占用jvm的内存空间,而是会占用操作系统的空闲内存空间

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

占多大的内存?

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

占哪里的内存?

这TM还用问?java线程当然是占用jvm的内存啊!(╯‵□′)╯︵┻━┻(手动滑稽)
好,我们做个实验,用jMeter同时并发调用java里某个接口200次,让java里增加大约190个线程(tomcat会有驻留线程,我这是10个),看下堆内存的情况:
java线程占多大的内存,占哪里的内存?第1张
从图中看到当线程猛增时,堆内存也猛增,然后堆内存会迅速下降,这是因为堆上new了大量的对象,所以猛增,然后线程执行完后,对象被GC了,所以下降。
上面提到堆内存下降是因为线程执行完了,GC回收了new出来的对象。但从图中看出,堆内存下降后线程数并没有下降,这是为什么呢?
用过线程池的都知道,线程执行完后并不会立即销毁掉,会有一个保活时间,保活时间过了后才会销毁,so
我用的是jdk1.8,每个线程占用1M内存,如果是占用的堆内存,那堆内存应该会增加190M左右,但从图中看并没有,所以线程不是占用的堆内存空间。

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

免责声明:文章转载自《java线程占多大的内存,占哪里的内存?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【LOJ#10172】涂抹果酱GridView点击一行 取数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HBase之七:事务和并发控制机制原理

作为一款优秀的非内存数据库,HBase和传统数据库一样提供了事务的概念,只是HBase的事务是行级事务,可以保证行级数据的原子性、一致性、隔离性以及持久性,即通常所说的ACID特性。为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应...

【性能测试】:JVM内存监控策略的方法,以及监控结果说明

JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题; 【JVM远程监控设置】 1、打开WAS控制台:https://ip:port/ibm/console/login.do 2、进入路径:应用程序服务器 > Server_Name > 进程定义> Java 虚拟机 3、在通用JVM参数中开启远程访问,并设置远程访问端口为10...

使用 suspend 和 resume 暂停和恢复线程

suspend 和 resume 的使用 在 Thread 类中有这样两个方法:suspend 和 resume,这两个方法是成对出现的。 suspend() 方法的作用是将一个线程挂起(暂停), resume() 方法的作用则是将一个挂起的线程重新开始并继续向下运行。 通过一个例子来看一下这两个方法的使用: public class SuspendT...

多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比

Thread.Start(),ThreadPool.QueueUserWorkItem都是在实现多线程并行编程时常用的方法。两种方式有何异同点,而又该如何取舍? 写一个Demo,分别用两种方式实现。观察各自的现象。  一个WorkMan class,其内的method doSomething()是每次异步线程调用的方法。该方法只是随机的让线程休眠一段时间。...

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原...

JAVA协程 纤程 与Quasar 框架

ava使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿意的话可以用-Xss来调小点),更不要说线程切换带来的开销了 为了节省开销,程序员玩出了很多花样。 最常用的是线程池(线程复用,但是完全无法处理阻塞调用的问题...