多线程

Posted fanf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

去分析多线程就要分析线程栈。

先了解一下java虚拟机的结构:

技术图片

Class file是类文件。写完程序后源码扩展名.java,源码是不能被运行的,需要做编译,编译的命令叫javac。编译后class文件,首先会调用一个系统,叫Classloader sub-system.

jdk目录下有一个javac,这是java的编译器。他会把一个源文件,编译为class。Class文件不能被直接执行,所以要装个java虚拟机。

 技术图片

Classloader sub-system.:类装载子系统,就是把磁盘上放的文件装载到Java虚拟机里。放到一大块内存空间里。专门给Java专用的。这是从操作系统的物理空间上挖出来的一大块,为了高效利用这块内存,又把这块内存分成了一片一片。方法、堆、栈、计数器、本地栈。Java内存专用区域。

做性能分析最重要的两点是堆内存、栈内存。栈里放线程信息,如线程执行状态、轨迹,栈里分的小但线程是私有的。

如下图有两块内存空间。右侧是堆,开启一个线程,就会在左侧开启一个空间来存这个信息。,左侧存一个线程的空间就叫栈。

 技术图片

有多少个线程就有多少个栈。栈是私有的,一个线程有一个自己的栈。分析栈的空间里的内容,其实就是分析线程。线程的状态输出来叫线程Dump(线程的快照)。

这么多线程产生的对象往堆里放。堆是共享的。所有线程产生的对象都在堆里。

在执行new的时候,产生的对象都会放到堆里去。栈里存放的东西不是固定的。int类型,如果有一个int a=10.,这个10应该放到栈里边。基本数据类型是放到栈里。对象一定是放到堆里。内存泄漏是在堆里的内存泄漏。就是分析堆里对象的使用。就是用完了没释放掉就是一次泄漏。

如果想看代码的执行过程、轨迹是在栈里体现。内存分析右边。cpu分析左边。

下图:所有的线程都共享这个heap,这叫堆。左边是一个线程栈,他们产生的对象全在这里面。

 技术图片

 

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)