精华内容
下载资源
问答
  • 一个线程占多大内存
    2022-01-08 18:04:56
    一个线程占用JVM多大内存?
    • java里每新起一个线程,jvm会向操作系统请求新起一个本地线程,此时操作系统会用空闲的内存空间来分配这个线程。所以java里线程并不会占用jvm的内存空间,而是会占用操作系统空闲的内存空间

    • jdk1.4默认的单个线程是占用256k的内存

    • jdk1.5+默认的单个线程是占用1M的内存

    • 可以通过-Xss参数设定,一般默认就好

    • PCB:进程控制块
      标识、文件、内存、优先级、上下文信息、状态、信号、I/O相关。

    • 在32位平台下,系统会给一个进程分配4G的虚拟内存供进程使用
      实际上我们只用了6M的虚拟内存

    更多相关内容
  • 线程占用多少内存
  • 一个jvm线程占用多少操作系统内存

    千次阅读 2021-02-26 11:14:30
    发现内存计算对不上由于我们这边设置的Xss是512K,即一个线程栈大小是512K,而由于线程共享其它MM单元(线程本地内存是是现在线程栈上的),所以实际线程堆外内存占用数量也是512K。进行如下计算:...

    找到关键点

    在看到12452个等待在CachedBnsClient.run的业务的一瞬间笔者就意识到,肯定是这边的线程导致对外内存泄露了。下面就是根据线程大小计算其泄露内存量是不是确实能够引起OOM了。

    发现内存计算对不上

    由于我们这边设置的Xss是512K,即一个线程栈大小是512K,而由于线程共享其它MM单元(线程本地内存是是现在线程栈上的),所以实际线程堆外内存占用数量也是512K。进行如下计算:

    12563 * 512K = 6331M = 6.3G

    整个环境一共4G,加上JVM堆内存1.8G(1792M),已经明显的超过了4G。

    (6.3G + 1.8G)=8.1G > 4G

    如果按照此计算,应用应用早就被OOM了。

    怎么回事呢?

    为了解决这个问题,笔者又思考了好久。如下所示:

    Java线程底层实现

    JVM的线程在linux上底层是调用NPTL(Native Posix Thread Library)来创建的,一个JVM线程就对应linux的lwp(轻量级进程,也是进程,只不过共享了mm_struct,用来实现线程),一个thread.start就相当于do_fork了一把。

    其中,我们在JVM启动时候设置了-Xss=512K(即线程栈大小),这512K中然后有8K是必须使用的,这8K是由进程的内核栈和thread_info公用的,放在两块连续的物理页框上。如下图所示:

    展开全文
  • 【java】java 一个线程占用多少内存

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

    在这里插入图片描述

    1.概述

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

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

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

    2.验证

    2.1 验证

    什么都不做的验证

     @Test
        public void threadSizeTest21() throws
    展开全文
  • 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内存。另外,这其实就是调用栈的大小,可以设置的,也就是说,创建一个线程的消耗其实就是调用栈的大小

     

    展开全文
  • JAVA技巧(Java多线程运行时,减少内存占用量).pdf
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 线程占用内存多大

    万次阅读 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: #
  • 原标题:Java 线程究竟占用多少内存dzone.com/articles/how-much-memory-does-a-java-thread-takeJVM 并没有主动按照线程数量分配 “threads ’ 1MB”,这错误来自 NMT 报告。Java 8 “committed memory”会自动置...
  • 事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源的占用已经完全可以忽略。 下面让我们通过一个测试来理解这个结论。 2 测试原理 在Windows操作系统下,启动10万...
  • opencv3和opencv4多线程内存泄漏问题:以cv::resize函数测试结果为例。 使用中可修复或者可避免内存泄漏:1)使用opencv2的版本;2)在代码中设置修复该问题.
  • 线程与JVM内存区域和JVM运行时内存

    千次阅读 2021-03-09 04:58:25
    JVM 允许一个应用并发执行线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java ...
  • 背景说明我们当前这个系统和很的第三方系统做了集成,出问题的就是其中一个三方系统。其实很简单,他们的系统会产生一些个人待办任务,然后待办任务的个数需要推送到我们的 APP 上,作为图标的角标显示。用户数据...
  • Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无限添加到无界队列中,导致内存满。
  • 而当我添加了调整线程后,发现同样一个小时后,虚拟内存变得非常的,达到20g左右。 注:这里调整线程的作用是:可以根据任务数的大小自动调整线程池中线程的数量,所以就涉及线程的添加和销毁。 1 测试 经过
  • 1万个线程占用多大内存

    千次阅读 2018-11-26 17:16:00
    栈大小? -Xss jinfo -flag ThreadStackSize 帧大小? 和方法中的局部变量,对象个数有关系 栈深度? 方法的进出分别对应一个入栈...那么一个线程占用多大的栈内存? 线程只有在运行中才会占用栈? Sleep的线程占用...
  • 而缺点在于线程需要占用内存线程占用的内存就多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程线程之间对共享资源访问会互相影响,所以得解决争用共享资源的问题,线程,也会导致控制起来更...
  • C#中线程占用内存解决方法
  • 关于 Java 应用的 线程内存大小

    千次阅读 2021-03-05 13:08:07
    关于 Java 应用的 线程内存大小作者: 认真生活每天 更新时间:2021-01-29 08:13:00 原文链接右侧开启环境实践本页内容对于 Java 应用, 对于内存占用, 主要是Java堆, 通常我们为了性能考虑, 会对堆设置最大值,...
  • Java 的线程到底占用了多少内存?

    千次阅读 2021-02-04 12:44:54
    若是有人问你正在运行的Java 程序的堆占用了多少内存, 你一个命令就给出了答案; 若是有人问你正在运行的 Java 程序的线程栈使用了多少内存, 该怎么得到答案呢? 故事背景 有人的 Java 程序遇到了 OOM,程序崩溃...
  • 最近刚深入学习 Thread 编程,这时候,就聊到了java的Thread所占内存是jvm中哪里的? 经过激烈的讨论 得出如下结论 首先,jvm的几变量要了解下: -Xms 为jvm启动时分配的初始堆的大小,也是堆大小的最小值,比如...
  • java线程池常驻线程占内存

    千次阅读 2021-02-26 08:35:38
    看了下代码: public void run() { try { Runnable task = firstTask;... 另外,线程常驻内存当然是占用内存的,但是线程资源占用的量是很小的,但是我们用来实现逻辑的其他资源占用内存的量就不好说啦。
  • 分析java 线程占用内存 本文将为您提供一个教程,使您可以确定活动应用程序Java线程中保留了多少Java堆空间 。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究,以使您更好地理解分析过程。 我们还将尝试...
  • JVM内存区域,开线程影响哪块内存

    千次阅读 2019-07-19 22:57:49
    就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用内存空间也会被释放掉。...
  • JAVA线程栈用多少内存

    千次阅读 多人点赞 2022-05-15 22:59:35
    因为每个线程都有自己独享的栈空间默认大小为1m, 栈的空间大小能决定在所有方法不出栈的情况下该线程能执行多少方法 2.为了方便测试我把栈大小设置为-Xss128k 这大小差不多可以执行900方法 3.测试不同的线程...
  • 在C#中我们,我们经常使用多线程,据我自己所了解到的启动多线程有以下几种方式: 1,Thread, 2,ThreadPool, 3,Task, 4,Parallel.For, ...暂且也当作是多线程种。 据我直观理解: 1.Th...
  • 【Java多线程内存模型JMM—主内存与工作内存分析

    千次阅读 多人点赞 2019-09-27 17:30:49
    工作内存: 每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和 对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。 所有的变量都存储在主内存中(虚拟机内存的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 485,399
精华内容 194,159
关键字:

一个线程占多大内存