多线程
作者:互联网
去分析多线程就要分析线程栈。
先了解一下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,线程,内存,栈里,多线程,堆里 来源: https://www.cnblogs.com/fanf/p/12918407.html