public class Test { public static void main(String[] args){ ThreadConstruction.test(); } } /* 第二章 深入理解Thread构造函数 Thread(String name); Thread(Runnable target); Thread(Runnable target, String name); Thread(ThreadGroup group, String name); Thread(ThreadGroup group, Runnable target); Thread(ThreadGroup group, Runnable target, String name); Thread(); Thread(ThreadGroup group, Runnable target, String name, long stackSize); */ /* 2.3 Thread和ThreadGroup 要点: 1.main线程所在的ThreadGroup称为main 2.构造一个线程时,如果没有指定ThreadGroup,则会与其父线程使用同一个group */ class ThreadConstruction{ public static void test(){ ThreadGroup group = new ThreadGroup("TestGroup"); Thread t1 = new Thread("t1"); Thread t2 = new Thread(group,"t2"); ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup(); System.out.println("main's Group:"+mainThreadGroup.getName()); System.out.println("t2's Group"+t2.getThreadGroup().getName()); // System.out.println("main's == t1's? "+(t2.getThreadGroup()==mainThreadGroup)); } } /* 2.5.1 Thread与Stacksize 要点: xss设置虚拟栈空间。虚拟栈空间越大,代表着线程内方法调用递归的深度就越深, 虚拟栈空间越小,则代表着创建的线程数量越多。 2.5.2 JVM内存结构 JVM内存结构包括:程序计数器、Java虚拟机栈、本地方法栈、堆内存、方法区、 Java8元空间 程序计数器: 无论任何语言,其实最终都需要由操作系统通过控制总线向CPU发送机器指令(其他语言的 程序计数器貌似都搁在cpu内的寄存器里的哦)。Java也不例外,程序技术器在JVM中所起 的作用就是用于存放当前线程接下来将要执行的字节码指令、分支、循环、跳转、异常等处 理信息。在任何时候,一个处理器只执行其中一个线程中的指令,为了能够在CPU时间片轮 转切换上下文之后顺利回到正确的执行位置、每条线程都需要具有一个独立的程序计数器, 各个线程之间互不影响,因此JVM将此块内存区域设置为线程私有的。 Java虚拟机栈: Java虚拟机栈也是线程私有的,它的生命周期与线程相同,是在JVM运行时所创建的。在 线程中,方法执行的时候就会常见一个名为栈帧的数据结构,主要用于存放局部变量表、 操作栈、动态连接、方法出口等信息。 ================================================== = 局部变量表 == 操作栈 == 动态链接 == 方法出口 == 其他 = ================================================== 每个线程创建的时候,JVM都会为其创建对应的虚拟机栈,方法的调用是栈帧被压入和弹出 的过程。同样的虚拟机栈,如果局部变量表等占用内存越小则可以被压入的栈帧就越多,反 之则可以被压入的栈帧就会越少,一般将栈帧内存的大小称为宽度,而栈帧的数量称为虚拟 机栈的深度。 本地方法栈: 网络通信、文件操作的底层、甚至String的intern等都是JNI方法,JVM为本地方法所划分 的内存区域便是本地方法栈。 堆内存: 堆内存被所有的线程共享,Java在运行期间所创建的所有对象几乎都存放在该内存区域,该 内存区域也是垃圾回收器重点照顾的区域,因此有些时候堆内存被称为“GC堆”。堆内存一般 分为新生代和老年代,更细致的划分为Eden区、From Survivor区、和To Survivor区 =============================================== = Survivor = = = = ====== ====== ====== =========== = = =Eden= = S0 = = S1 = = Tenured = = = = = = = = = = = = = ====== ====== ====== =========== = = = =============================================== 方法区: 方法区被所有线程所共享,它主要用于存储已经被虚拟机加载的类信息、常量、静态变量、即 时编译器编译后的代码等数据, Java8元空间 JDK1.8起,持久代内存被彻底删除,取而代之的是元空间。 */
——《Java高并发编程详解》笔记