精华内容
下载资源
问答
  • 1万个线程占用多大内存

    千次阅读 2018-11-26 17:16:00
    栈大小? -Xss jinfo -flag ThreadStackSize 帧大小? 和方法中的局部变量,对象个数有关系 栈深度? 方法的进出分别对应一个入栈...那么一个线程占用多大的栈内存? 线程只有在运行中才会占用栈? Sleep的线程占用...

    栈大小? -Xss   jinfo -flag ThreadStackSize

    帧大小? 和方法中的局部变量,对象个数有关系

    栈深度?

    方法的进出分别对应一个入栈和出栈

     

    -Xss512k    这个值越大,栈深度max-stacks越大,递归的次数越大, 但是整体支持线程数越小

     

    那么一个线程占用多大的栈内存?       线程只有在运行中才会占用栈?  Sleep的线程不占用栈?

    linux 64上默认栈大小1M ,    4000*1M=4G,   4000TPS/QPS? 真实并发,非连接数

                      10000*1M=10G ,   按1/10活动量,对应单台连接数可以达到10W, 实际端口最大6w

    堆区+方法区越大,运行时空间(栈)越小  一台32G内存的机器,分给栈空间可能只有5G

     

     

     

     

    http://unixboy.iteye.com/blog/174173

    https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

    http://www.10tiao.com/html/677/201612/2650886922/1.html

    转载于:https://www.cnblogs.com/yszzu/p/10021531.html

    展开全文
  • 偶然看到一个信息,说java的线程默认占用1M内存。然后我就查了查 线程堆栈也会申请内存。堆栈大小由 -Xss 选项指定,默认每个线程1M,幸运的是情况并非那么糟糕。操作系统会以延迟分配的方式分配内存页面,比如在第...

    在这里插入图片描述

    1.概述

    偶然看到一个信息,说java的线程默认占用1M内存。然后我就查了查

    线程堆栈也会申请内存。堆栈大小由 -Xss 选项指定,默认每个线程1M,幸运的是情况并非那么糟糕。操作系统会以延迟分配的方式分配内存页面,比如在第一次使用时分配,因此实际使用的内存要低得多,通常每个线程堆栈占用80至200KB

    还有其他 JVM 部件会占用本地内存,但它们在总内存消耗中通常比例不大。

    2.验证

    2.1 验证

    什么都不做的验证

     @Test
        public void threadSizeTest21() throws
    展开全文
  • 事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源的占用已经完全可以忽略。 下面让我们通过一个测试来理解这个结论。 2 测试原理 在Windows操作系统下,启动10万...

    1 问题描述

    今天讨论的时候,有人提出了这个的一个观点:多线程会占用大量的内存。

    事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源的占用已经完全可以忽略。

    下面让我们通过一个测试来理解这个结论。

    2 测试原理

    在Windows操作系统下,启动10万个线程,比较前后内存的占用量,以计算出每个线程的内存占用情况。

    这里有几点注意:

    本测试结果不应该受语言影响,因为线程的调度是由操作系统完成的,所以本测试的结论是基于操作系统的;

    每个线程中不包括任何多余数据,所以最终结论仅应该是每个线程占用内在的情况,而与线程中的数据无关;

    3 测试数据

    根据附件的图片显示,可以得出以下内容:

    启动10万个线程前 0.06% 44,736
    启动10万个线程后 0.42% 584,816
    注:工作集即是内存实际战胜情况。

    4 测试结论

    通过这个数据,我们可以得出这个的结论:

    每个线程占用的内存约为:(584,816 - 44,736)/10000 = 540KB.

    在Linux下测试结论的值为每个线程占用220KB(注:由于测试机器内存小只测试了1万个线程)。

    附1:测试代码

    import java.util.concurrent.TimeUnit;
     
    public class ThreadUsage implements Runnable {
     
        public static void main(String[] args) throws Exception {
            // 等待30秒,以方便截取当前程序占用的硬件资源信息
            TimeUnit.SECONDS.sleep(30);
     
            // 启动10万个线程
            for (int i = 0; i < 10000; i++) {
                 new Thread(new ThreadUsage()).start();
            }
        }
     
        // 每个线程做的事情就是等待。
        @Override
        public void run() {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    附2:一些测试图片

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Linux下创建一个线程占用多少内存

    千次阅读 2018-09-08 12:57:34
    在前面的博客进程分配资源中,我们了解到,在32位平台下,系统会给一个进程分配4G的虚拟内存供进程使用。 因此,我们知道,一个进程被创建时将被分配有4G的虚拟内存。事实上,并不是每次都会用完这4G内存的,下面的...

    在前面的博客进程分配资源中,我们了解到,在32位平台下,系统会给一个进程分配4G的虚拟内存供进程使用。

    因此,我们知道,一个进程被创建时将被分配有4G的虚拟内存。事实上,并不是每次都会用完这4G内存的,下面的例子可以看到。

    #include <stdio.h>
    #include <unistd.h>
    
    int main(){
        while(1){
            sleep(1);
        }
        return 0;
    }
    

    在我们上面的程序中,我们只在main函数写了一个死循环,以便我们来关注该进程占有的内存大小 

    注意上图的红框部分,这是ps命令列出来的VSZ选项,表示进程占用的虚拟内存,于是我们可以看到,主线程main占用的虚拟内存是4164差不多就是6M。系统分配给了我们4G的虚拟内存,但实际上我们只用了6M的虚拟内存(这就可以验证我们上面说并不会每次用完4G的虚拟内存)。

    我们知道了一个进程被创建时分配的内存,那么一个线程创建时会分配多少内存呢?

    我们通过在上面的代码中创建一个线程来验证

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    void* thread(void* arg){
        while(1){
            sleep(1);
        }
    }
    
    int main(){
        pthread_t thread1;
        if(pthread_create(&thread1,NULL,thread,NULL) < 0)
            perror("pthread_create");
        while(1){
            sleep(1);
        }
        return 0;
    }
    

    一个主线程main+一个线程占有的虚拟内存是16700K,16700 - 6324 = 10376K,差不多就是10M。为什么我们多创建一个线程就会多出来10M的空间呢?这里我们可以想到,进程中的所有线程是共享进程的地址空间的,但是系统会为每个线程分配独立的调用栈,也就说每个线程都会有一个自己的调用栈。在我们当前的机器下,我们设置的调用栈的大小就是10M。

    [pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -s
    10240

    于是我们就想到,这个多出来的10M虚拟内存,是不是就是新线程的调用栈的大小呢?

    我们再创建一个线程看看

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    void* thread_entry1(void* arg){
        while(1){
            sleep(1);
        }
    }
    
    void* thread_entry2(void* arg){
        while(1){
            sleep(1);
        }
    }
    
    int main(){
        pthread_t thread1;
        pthread_t thread2;
        if(pthread_create(&thread1,NULL,thread_entry1,NULL) < 0)
            perror("pthread_create");
        if(pthread_create(&thread2,NULL,thread_entry2,NULL) < 0)
            perror("pthread_create");
        while(1){
            sleep(1);
        }
        return 0;
    }
    

    26944 - 16700 = 10244,差不多也是10M。

    所以我们基本可以推断,创建一个线程,会给这个内存分配10M的虚拟内存,也就是说,创建一个线程的消耗是10M内存。另外,这其实就是调用栈的大小,可以设置的,也就是说,创建一个线程的消耗其实就是调用栈的大小

     

    展开全文
  • linux下一个线程占用多少内存

    万次阅读 2011-07-06 09:34:25
    群里讨论出mysql的问题,因为mysql是一个连接建立一个线程的,这就涉及到mysql可以建立多少个线程。无论是windwos 还是linux ,每个线程都有自己独立的stack,每个stack 都占用一定的空间。windwos 默认的是1M,这个...
  • 线程占用内存多大

    万次阅读 2016-06-03 17:49:37
    #include #include int main() { // char *p =(char *) malloc(1024*1024); while(1) { sleep(1); } return 0; }主线程main占用内存大小为4188K ,大约4M 示例2: #
  • Android开发中,开启一个线程占用多少内存空间?这个问题我一直没有测试过,以前在网上看见别人说需要1M内存(可能是该网友包含了很数据),今天对这个问题做了一个测试。为了不影响测试,我使用空线程线程不...
  • 分析java 线程占用内存 本文将为您提供一个教程,使您可以确定活动应用程序Java线程中保留了多少Java堆空间 。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究,以使您更好地理解分析过程。 我们还将尝试...
  • Linux 多线程内存占用分析

    千次阅读 2014-08-11 22:39:11
    大概现象为,一个很简单的程序逻辑,开启了几个线程,程序本身并没有过多的申请内存,或者说根本没有申请内存,但是在实际运行起来后,通过PS命令和status 查看内存占用居然达到了40M,详细分析了smaps文件没有得到...
  • 篇文章弄懂Java多线程基础和Java内存模型

    万次阅读 多人点赞 2020-04-12 19:07:17
    文章目录多线程的生命周期及五种基本状态二、Java多线程的创建及启动1.继承Thread类,重写该类的run()方法2.通过实现Runnable接口创建线程类3.通过Callable和Future接口创建线程三、Java内存模型概念四、内存间...
  • C#中线程占用内存解决方法

    千次阅读 2017-07-10 10:03:03
    C#中线程占用内存解决方法 项目中用到了多线程,而且是1000线程并发运行,发现内存占用过高,于是对项目里用到的对象逐个测试,发现是线程对象占用内存 Thread[] threads = new Thread[1000]; for...
  • 如果一个线程发生堆内存溢出,或者栈内存溢出,其他线程是否还会继续工作 不废话,先上答案,不管是堆内存溢出,或者栈内存溢出,其余线程都会继续工作 1:首先测试堆内存溢出 **1.1:试用IDEA测试,代码如下:** ...
  • JVM内存模型 - 主内存线程独立的工作内存Java内存模型规定,对于线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,...如何保证线程操作主内存的数据完整性是一个难题,Java内存模型也规
  • 1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从到小排序,大写M以内存大小排序】 2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这进程id 3、通过命令...
  • 工作内存: 每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和 对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。 所有的变量都存储在主内存中(虚拟机内存的...
  • 最近查系统的内存泄露问题时,发现VIRT内存涨的特别厉害,
  • 在C#中我们,我们经常使用多线程,据我自己所了解到的启动多线程有以下几种方式: 1,Thread, 2,ThreadPool, 3,Task, 4,Parallel.For, ...暂且也当作是多线程种。 据我直观理解: 1.Th...
  • java线程内存模型 线程、工作内存、主内存三者...每个线程有自己的工作内存 refreshing local memory to/from main memory must comply to JMM rules   产生线程安全的原因 线程的working memor
  • 多线程内存管理

    千次阅读 2010-11-13 17:39:00
     原文:http://yachang.wang.blog.163.com/blog/static/35551220200762753057335/<br />   假设有一个进程,创建了两个线程A、B,线程A在堆上分配了一块内存空间,通知传指针的方式在B中使用,使用完...
  • java多线程-cpu内存占用-定位分析

    千次阅读 2016-03-08 13:16:23
    建立2个线程类,一个run死循环执行大量io,另一个run死循环执行1秒睡眠。main方法开启4线程,上述每个开启2个。 高占用如下: 下载process explorer可查看进程的详细信息: 可看出,java进程里2...
  • 多线程(二)内存模型-线程安全

    千次阅读 2018-03-30 20:09:57
    转载地址: ...所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存中,保存了被该线程使用到的变量的主内存副本拷贝,线程只能直接操作工作内存中的变量。内存模型三...
  • 多线程程序中遇到内存溢出异常,程序终止。 system.outofmemoryexception 原因: 例:MyFile对象中(img属性)存放的为读取的文件二进制byte[],当img属性被其他对象引用完成后,线程结束时进行 MyFile =null; ...
  • C++多线程内存管理

    千次阅读 2011-05-16 17:00:00
     原文:http://yachang.wang.blog.163.com/blog/static/35551220200762753057335/<br /> 假设有一个进程,创建了两个线程A、B,线程A在堆上分配了一块内存空间,通知传指针的方式在B中使用,使用完后释放块...
  • cleanDataTimer.Elapsed += new ElapsedEventHandler(CleanData); cleanDataTimer.Interval = 0.000000000006; cleanDataTimer.Enabled = true; Thread addRCSMemoryData = new Thread(new ThreadStart...
  • 所有线程共享主内存,每个线程有自己的工作内存 refreshing local memory to/from main memory must comply to JMM rules 产生线程安全的原因 线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计....
  • 查看个线程的CPU 内存占用

    千次阅读 2016-03-18 18:34:11
    #include #include #include ...ps a 找到test进程的PID 然后top -H -p [PID] 可以查看这进程 所有线程的CPU使用率,,,,,但是所有线程内存使用是一样的,,,,这无法查看线程内存占用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 424,548
精华内容 169,819
关键字:

一个线程占多大内存