精华内容
下载资源
问答
  • 2021-02-26 11:14:30

    找到关键点

    在看到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内存。另外,这其实就是调用栈的大小,可以设置的,也就是说,创建一个线程的消耗其实就是调用栈的大小

     

    展开全文
  • 我做一个聊天软件我双击一个好友头像时执行一个线程弹出一个窗口线程里run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用我找到了地方是上一个窗口弹...我做一个聊天软件 我双击...

    我做一个聊天软件我双击一个好友头像时执行一个线程弹出一个窗口线程里run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用我找到了地方是上一个窗口弹...

    我做一个聊天软件 我双击一个好友头像时 执行一个线程 弹出一个窗口 线程里 run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用

    我找到了地方是上一个窗口弹出的时执行的线程里面占用着10000这个端口 我没有停掉上一个窗口的线程,所以上一个窗口占用的那个10000的端口没有释放掉

    那么请问大神们 如何手动停止线程,并且释放掉run方法里面占用的端口

    因为run方法里面有DatagramSocket类的receive方法,这个是阻塞式的没有接受到信息就不会往下执行,所以所占用的端口没有释放掉

    大神们 要如何释放掉哇?

    public void run()

    {

    try

    {

    while(true)

    {

    DatagramSocket ds=new DatagramSocket(10000);

    byte buffer[]=new byte[1024*64];

    DatagramPacket dp=new DatagramPacket(buffer,buffer.length);

    System.out.println("OK1");

    ds.receive(dp);

    System.out.println("OK2");

    String mess=new String(dp.getData(),0,dp.getLength());

    Date d=new Date();

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");

    String str=sdf.format(d);

    recArea.append(str+"\n");

    recArea.append(mess+"\n");

    ds.close();

    }

    }

    catch(Exception e)

    {

    System.out.println(e.getMessage());

    }

    }

    线程里面的run方法

    就是 DatagramSocket ds=new DatagramSocket(10000);这句占用着10000端口没有释放掉

    展开

    展开全文
  • 线程开启需要占用资源有哪些?

    千次阅读 2020-05-17 15:45:26
    通常系统分配一个时间片大约30ms,意思就是1秒中被分配至少33份,分别执行不同的线程。 【2】Thread环境块(了解) 【3】用户堆栈模式(主要部分):用户程序中的局部变量和参数传递所使用的堆栈,如果是引用类型...
  • 1、top -H top -H --直接查看系统中所有进程以及其中线程的运行情况 top -H -p <pid> --查看特定进程下的线程运行情况 ...htop比较类似于windows资源管理器,是一个基于ncurses的交互进程查看器 ...
  • Java 的线程到底占用多少内存?

    千次阅读 2021-02-04 12:44:54
    若是有人问你正在运行的Java 程序的堆占用多少内存, 你一个命令就给出了答案; 若是有人问你正在运行的 Java 程序的线程栈使用了多少内存, 该怎么得到答案呢? 故事背景 有人的 Java 程序遇到了 OOM,程序崩溃...
  • 进程与线程占用资源

    千次阅读 2020-04-23 15:28:30
    2、线程占有的资源 (1)栈 (2)寄存器 (3)状态 (4)程序计数器 3、线程共享的内容 (1)代码段code segment (2)数据段data section (3)进程打开的文件描述符 (4)信号的处理器 (5)进程的当前目录和 (6...
  • linux服务器查询java线程占用资源

    千次阅读 2018-08-23 13:44:42
    1、使用top命令 ,查询java进程 比如选择86184这进程 2、用 top -H -p 86184 ,查询该进程下的线程...4、比如,观察到86344这个线程占用cpu 大, 将十进制的86344 转换成16进制 15148  cat jstack.txt | gr...
  • 关于C++11多线程资源回收问题

    千次阅读 2019-02-13 18:21:45
    程序启动时,std::Thread 开启了一个线程线程里有new一些内存块,然后有一个while循环,循环里有一个http的请求数据的操作,每次如果有HTTP请求的话都会暂时阻塞线程5s,但是这个时候我关闭客户端的话,需要通知...
  • 今天讨论的时候,有人提出了这个的一个观点:多线程占用大量的内存。 事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源占用已经完全可以忽略。 下面让我们...
  • 监控系统所有进程的CPU使用...在CSDN上找到两个都不太好用,自己写了一个VS2013环境下编译通过 也可以直接运行\bin\Debug目录下的ConsoleApplication1.exe文件 用途:查看自己写的程序那个线程运行时间最多,耗资源等。
  • 一个电脑最多能开启多少线程?

    千次阅读 2021-07-31 00:24:10
    —-一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小...
  • 线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: ...
  • 、使用
  • 一个进程最多可以创建多少线程

    千次阅读 多人点赞 2021-07-15 09:19:09
    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的...
  • CPU,进程, 线程占用关系

    千次阅读 2020-09-15 22:35:21
    并发和并行的概念区分: 并发,指的是多个事情,在...只有在多CPU或者一个CPU多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。 ...
  • 在windows系统下,默认只能够查看进程的使用情况而不能查看线程的详细信息,使用此工具能够查看所有的线程的详细信息
  • 可以用下面的命令将 ...这命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。 直接使用 ps Hh -eo pid,t
  • 次GC线程占用系统CPU过高处理过程

    千次阅读 2018-12-12 20:18:52
    因为测试人员报告说,最近订单系统总是超时,要重启才能恢复正常,但是第二次复现的时间不固定。 然后先是查看下应用状态是否正常,没有问题。...发现订单应用的CPU已经100%,但是内存还有剩余,内存占用 大概30...
  • windows下如何查看某个进程有多少个线程,及各个线程的CPU、名称等详细信息
  • Windows线程资源查看工具

    热门讨论 2011-09-26 11:35:52
    在Windows平台下查看进程中线程CPU等资源占用情况
  • 线程线程数设置多少合适

    万次阅读 多人点赞 2020-06-30 01:15:04
    前沿 大家都用过线程池,但是线程池数量设置为多少比较合理呢? 线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去...方案一:一个线程执行任务
  • 一个进程能运行多少线程

    千次阅读 2019-04-11 15:22:41
    也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进...
  • 线程结束资源释放

    千次阅读 2016-01-13 16:28:28
    我们可以看到的就是线程描述符,线程堆栈,在系统内部还会有更复杂的系统维护一些信息,在线程创建时,内核总会为其维护一些资源,比较理想的情况是线程运行结束后,释放系统资源和进程资源,包含线程返回值占用的...
  • 线程退出后资源释放问题

    千次阅读 2020-10-10 16:45:45
    使用pthread_create()创建线程时,设置属性为NULL,线程退出时该线程占用资源不会释放。比如遇到过反复创建某个线程后返回,会导致其占用的虚拟内存不断增加,最终导致系统资源不可用。 二、线程退出时如何释放...
  • 一个原因是,我在服务器中创建了一个线程池,我很想知道线程池的个数上限,从而更好的制定线程池动态增减的方法,所以也做了同样的测试。 首先分析32位linux系统 对32位系统来说,理论上的寻址范围是4G(2^32),...
  • 一个线程加锁,另一个线程解锁

    千次阅读 2017-08-03 15:03:30
    一般来讲,一个线程加锁,另一个线程解锁,是很容易死锁的。 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 345,928
精华内容 138,371
关键字:

一个线程占用多少资源