精华内容
下载资源
问答
  • 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服务器查询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...

    1、使用top命令 ,查询java进程

    比如选择86184这个进程

    2、用 top -H -p 86184  ,查询该进程下的线程资源

     

    3、使用jstack 86184 > jstack.txt  ,输出 该进程下的线程信息,

    4、比如,观察到86344这个线程占用cpu 大, 将十进制的86344 转换成16进制  15148

      cat jstack.txt | grep -i  15148

    可以查看到是ump 监控线程的信息 

    展开全文
  • Android开发中,开启一个线程占用多少内存空间?这个问题我一直没有测试过,以前在网上看见别人说需要1M内存(可能是该网友包含了很多数据),今天对这个问题做了一个测试。为了不影响测试,我使用空线程线程不...

    Android开发中,开启一个线程会占用多少内存空间?这个问题我一直没有测试过,以前在网上看见别人说需要1M内存(可能是该网友包含了很多数据),今天对这个问题做了一个测试。为了不影响测试,我使用空线程(线程不做任何事情,也不包含任何数据)。

    先贴上测试代码

    thread_occupy_memory.xml

    [html] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.     <Button android:id="@+id/start_thread"  
    7.         android:layout_width="fill_parent"  
    8.         android:layout_height="wrap_content"  
    9.         android:text="开启一个新线程" />  
    10.     <TextView  
    11.         android:layout_width="fill_parent"  
    12.         android:layout_height="wrap_content"  
    13.         android:textSize="20dp"  
    14.         android:text="内存" />  
    15.     <TextView android:id="@+id/show_memoty"  
    16.         android:layout_width="fill_parent"  
    17.         android:layout_height="fill_parent" />  
    18. </LinearLayout>  

    [java] view plaincopy
    1. import java.util.ArrayList;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.os.Handler;  
    6. import android.os.Message;  
    7. import android.view.View;  
    8. import android.view.View.OnClickListener;  
    9. import android.widget.TextView;  
    10.   
    11. /** 
    12.  * 测试开启一个空线程会占用多少内存 
    13.  * @author DaveeChen 
    14.  */  
    15. public class ThreadOccupyMemoryActivity extends Activity {  
    16.     private TextView mTextView;  
    17.     private ArrayList<Object> threadList = new ArrayList<Object>();  
    18.     @Override  
    19.     public void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         this.setContentView(R.layout.thread_occupy_memory);  
    22.   
    23.         init();  
    24.     }  
    25.       
    26.     private void init() {  
    27.         this.findViewById(R.id.start_thread).setOnClickListener(new OnClickListener() {  
    28.             public void onClick(View v) {  
    29.                 MyThread mMyThread = new MyThread();  
    30.                 threadList.add(mMyThread);  
    31.                 mMyThread.start();  
    32.             }  
    33.         });  
    34.   
    35.         mTextView = (TextView)this.findViewById(R.id.show_memoty);  
    36.         mTextView.setText(analyzeMemory());  
    37.     }  
    38.   
    39.     private String analyzeMemory() {  
    40.         Runtime mRuntime = Runtime.getRuntime();  
    41.         long usedMemory = mRuntime.totalMemory() - mRuntime.freeMemory();  
    42.         String result = "线程数量:"+threadList.size()  
    43.                 +"\nUsedMemory:"+usedMemory  
    44.                 +"bytes;\n"  
    45.                 +"---------------------------------\n";  
    46.         return result;  
    47.     }  
    48.   
    49.     private Handler mHandler = new Handler() {  
    50.         @Override  
    51.         public void handleMessage(Message msg) {  
    52.             if (msg.what == 1) {  
    53.                 mTextView.setText(msg.obj.toString() + mTextView.getText());  
    54.             }  
    55.         }  
    56.     };  
    57.   
    58.     private class MyThread extends Thread {  
    59.         @Override  
    60.         public void run() {  
    61.             mHandler.sendMessage(mHandler.obtainMessage(1, analyzeMemory()));  
    62.             while(true) {//让线程保持一直运行  
    63.                   
    64.             }  
    65.         }  
    66.     }  
    67. }  


      

    在启动线程之前,已使用内存3015936字节(大约3015K)。启动一个线程后,内存已使用3030904(大约3030K),说明开启第一个线程使用了大约15K内存;

    当开启了10个线程之后,内存已使用3071064(大约3071K),说明开启10个空线程大约用了55K内存。


    我也测试了AsyncTask,占用内存和Thread差不多

    [java] view plaincopy
    1. private class MyAsyncTask extends AsyncTask<Void,Void,Void> {  
    2.         @Override  
    3.         protected Void doInBackground(Void... params) {  
    4.             mHandler.sendMessage(mHandler.obtainMessage(1, analyzeMemory()));  
    5.             while(true) {//让线程保持一直运行  
    6.                   
    7.             }  
    8.             //return null;  
    9.         }  
    10.     }  
    from: http://blog.csdn.net/chenfeng0104/article/details/7449622
    展开全文
  • 线程开启需要占用资源有哪些?

    千次阅读 2020-05-17 15:45:26
    通常系统分配一个时间片大约30ms,意思就是1秒中被分配至少33份,分别执行不同的线程。 【2】Thread环境块(了解) 【3】用户堆栈模式(主要部分):用户程序中的局部变量和参数传递所使用的堆栈,如果是引用类型...

    一、线程开启所占用的空间开销

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

    【2】Thread环境块(了解)

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

    二、线程在时间的上的开销

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

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

    展开全文
  • 比如说初始占用的内存一般情况下是多少一个应用的线程数量有上限吗
  • 线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: ...
  • 找出cpu资源占用最多的那个线程

    千次阅读 2015-11-05 17:40:29
    linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 先用top命令找出占用资源厉害的java进程id,如: 如上图所示,java的进程id为'12377...
  • linux进程、线程(or子进程)、资源占用查看
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 先用top命令找出占用资源厉害的java进程id,如: 如上图所示,java的进程id为'12377'...
  • 今天讨论的时候,有人提出了这个的一个观点:多线程占用大量的内存。 事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源占用已经完全可以忽略。 下面让我们...
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 先用top命令找出占用资源厉害的java进程id,如: 如上图所示,java的进程id为'12377...
  • [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,要求占用资源最少,效率最高? 我所知道的不让主线程退出的方法有: 一,死循环:while(1);/ for(;;); 二,pause(); 让主线程暂停等待信号使其退出 ...
  • Linux 查看线程占用情况

    千次阅读 2016-01-08 14:14:50
    查看线程资源占用情况 top -H -p pid 找到对应的pid,转换成16进制 printf 0x%x pid 然后jstack pid > 文件 在文件中查找16进制pid
  • 1、下载Windows系统和应用程序监视工具Process Explorer ... 2、打开ProcessExplorer,找到cpu占用高的java.exe,记下进程编号PID,比如当前是9520 ...3、双击java.exe进程,打开查看CPU占用高的线程,记下线程编号TID...
  • Linux查看线程信息,定位某线程占用CPU高问题 相关命令:top, ps aux | grep pid, jstack 1、首先使用top命令定位到占用CPU高的进程PID [root@QIANZI-BASE home]# top 查看进程的详细信息 [root@QIANZI-BASE ...
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 先用top命令找出占用资源厉害的java进程id,如: 如上图所示,java的进程id为'12377...
  • 可以用下面的命令将 ...这命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。 直接使用 ps Hh -eo pid,t
  • 线程结束资源释放

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

    千次阅读 2013-08-23 17:37:06
    01,pidof 进程名称  得到进程的 PID 02,top -p 所得 PID值 03,按“H ”
  • 次GC线程占用系统CPU过高处理过程

    千次阅读 2018-12-12 20:18:52
    因为测试人员报告说,最近订单系统总是超时,要重启才能恢复正常,但是第二次复现的时间不固定。 然后先是查看下应用状态是否正常,没有问题。...发现订单应用的CPU已经100%,但是内存还有剩余,内存占用 大概30...
  • 、使用
  • 被问懵了:一个进程最多可以创建多少线程

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

    万次阅读 2017-09-22 00:45:40
    最近项目中遇到循环8M的内存泄漏问题,排查后发现是由于特殊场景下使子线程异常退出,主线程发现子线程退出便再次创建线程,此时未回收退出线程资源造成了内存泄漏,导致数据库宿主机oom,此问题不仅导致内存泄漏...
  • 我写了一个死循环当满足条件就跳出,然后用线程开始这个循环,但是一启动线程CPU占用就很高,即使死循环里面什么代码都没有。请问怎么解决这个问题,用计时器的话CPU占用就很低,但是用计时器键盘钩子经常掉。一会就...
  • 线程占用内存多大?

    万次阅读 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多线程如何实现资源共享

    千次阅读 2015-04-11 22:21:04
    Java实现多线程方式有两种:继承Thread类或者实现...实现Runnable接口可以实现资源共享 下面让我们来看一下代码:public class Thread1 extends Thread{ private int num = 5; @Override public void run() { for
  • 有时候发现某个进程cpu占用特别高,这进程里有1以上的线程,这时候我们须要定位线程占用的cpu。 ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这命令实际调试程序的时候非常有用,列出了进程id,...
  • 句话总结:线程创建的时候默认处于joinable状态,此状态线程结束的时候不会自动回收线程资源,需要pthread_join函数来回收;pthread_detach可以讲线程转换为detached状态,子线程运行完成之后可以自行回收资源。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 301,987
精华内容 120,794
关键字:

一个线程占用多少资源