zoukankan      html  css  js  c++  java
  • 线程池和jvm的自动回收机制带来的疑问

    A:线程池是将线程对象实例预先实现的一种方式,节省了对象的创建时间和销毁时间

    可这样给我带来了疑问,对于jvm有对不再使用的实例有自动回收的机制

    那么将线程实例放在 threadVector 这种向量中的方式, jvm会不会将线程实例当作不再使用的资源进行回收咧?

    B:第一,既然把一个对象放到了threadVector中,那么至少threadVector在引用着这个对象,既然这个对象还在被引用,那么GC就不会回收;
    第二,这个问题还真被你问着了,线程对象不同于一般对象的一个区别就是:一般情况下垃圾回收器不会回收到thread对象。thread对象由于需要被系统管理和调度,它需要注册,所以某个地方总会有指向这个线程对象的reference。举例来说:

    public static void f() {
        new MyThread().start();
    }

    public static void main(String args[]) {
        f();
    }
    从表面上来看,f函数退出之后,程序中已经没有任何对象引用那个新创建的thread对象了,但是此时GC仍然不会回收到它。

    C:不会回收thread?
    这样不是会导致了内存泄漏或者非法占有么...

    B:不会的,一个程序退出了,它的所有线程都会被注销,那个时候应该会回收。

     
    A:可是这样线程池的销毁机制相当于在做无用功...

    通常使用线程池都是在服务程序上使用,这么说来,如果服务程序不用线程池,而是每次都开一个线程来完成工作然后关闭

    作为服务运作的程序通常都是开机启动,重启关机退出,这段时间内,系统内存很快就会被这些不用被销毁的线程消耗光了?
     
    C:那么将线程实例放在 threadVector 这种向量中的方式, jvm会不会将线程实例当作不再使用的资源进行回收咧?
    ---------
    既然把一个对象放到了threadVector中,那么至少threadVector在引用着这个对象,既然这个对象还在被引用,那么GC就不会回收;
     
    C:作为服务运作的程序通常都是开机启动,重启关机退出,这段时间内,系统内存很快就会被这些不用被销毁的线程消耗光了?
    ---------
    使用一个线程才会申请相应的内存空间
    不用怎么会消耗内存呢
     
  • 相关阅读:
    [转]好习惯养成的10个步骤
    模拟资料
    [转]暗时间
    [转]30个小改变,造就你的卓越人生
    [转]Word 2007文档中图片不显示或对象不显示的解决方法
    ubuntu 10.04 安转2.6.38内核
    [转]可以让你少奋斗10年的工作经验
    [转]Vim 复制粘帖格式错乱问题的解决办法
    C# 获取类中所有的属性
    sql 脚本
  • 原文地址:https://www.cnblogs.com/huangwentian/p/14606502.html
Copyright © 2011-2022 走看看