java线程简析

来源:互联网 发布:mac电脑刷机数据恢复 编辑:程序博客网 时间:2024/05/16 09:11

线程基本概念在这里就不多说了,今天没事就是想随便创建一个类,然后看下线程运行,结果发现除了main线程还有4个系统守护线程,分别如下:


1.关联监听器

2.信号分发器

3.最终处理器

4.引用处理器

那attach机制是什么?说简单点就是jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们跑了一个jstack的进程,然后传了个pid的参数,告诉它要哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什么参数等。

attach能做些什么
     总结起来说,比如内存dump,线程dump,类信息统计(比如加载的类及大小以及实例个数等),动态加载agent(使用过btrace的应该不陌生),动态设置vm flag(但是并不是所有的flag都可以设置的,因为有些flag是在jvm启动过程中使用的,是一次性的),打印vm flag,获取系统属性等

finalizer:当垃圾回收系统发现一个对象没有任何的引用的时候,也就是不可到达的时候,会把该对象标记成 finalizable , 并且把它放入到一个 Finalize Queue(F-Queue) 的特殊队列里。当系统检测到这个 F-Queue 不为空的时候,就会从队列里弹出一个对象出来,调用其 finalize() 方法,把这个对象标记为 finalized ,这样,下次GC的时候,这些对象就可以被回收掉了,做这些事情应该是在一个或者多个线程里去做的,也可能就是GC线程,但是可以肯定的是,这些线程,优先级要比其他线程低一些,所以占用的 CPU 时间是比较少的。在Java 设计上,默认的 finalize() 方法是空的,它是不希望在这里做太多的事情的,期望尽量不在这里做任何事情。这里的理解是比较简单的,很多细节被忽略掉了。比如被放入F-Queue的,不是对象本身,而是一个 Finalizer 对象,当一些特殊情况下,比如在一个循环里,不停的创建对象,创建完了没有其他任何的引用,这样,这些对象都被标记为可回收的状态,会有很多的 Finalizer 对象存在,而处理 Finalizer 对象的线程比主线程的优先级要低,创建的速度大于了回收的速度,可能会积攒很多 Finalizer 对象在内存里,这个时候是有可能内存溢出的




原创粉丝点击