java虚拟机深入理解
周志朋老师写的“深入理解Java虚拟机”中的第二章,是很重要的一章,个人认为,作为一个java程序员一定要将Java最经典最有价值的“Java虚拟机”搞懂,就算是搞不全懂,也要能说出个中原理,这才不愧为一名java程序员。反复读了2.2.2java虚拟机栈,大概明白其中含义。总结为以下几点:
1. Java虚拟机栈和程序计数器一样,是每个线程对应一个,也就是说,如果启动了n个线程,那么就有n个程序计数器及n个java虚拟机栈,栈的生命周期与线程是相同的。
2. 每个方法执行时都会创建自己对应的一个栈帧,虚拟机就会把这个栈帧压入到这个方法对应的线程的Java虚拟机栈中。但方法执行完成时再将该栈帧弹出对应的java虚拟机栈中。
3. 任何线程都不能访问另一个线程的程序计数器(PC寄存器)和java虚拟机栈
4. 栈帧中存储着:局部变量表(包括:基本数据类型、对象引用、returnAddreess类型)、操作数栈、动态链接、方法出口等。
Java虚拟机栈与线程是一对一的关系,方法与栈帧是一对一的关系,线程与方法是一对多的关系,所以线程与栈帧是一对多的关系,所以java虚拟机与栈帧是一对多的关系。oh,我懂。局部变量表的内存空间在编译期间就是可知的,方法运行期间是不可被改变的。
读GC日志:
[GC[DefNew: 5504K->640K(6144K), 0.0114236 secs] 5504K->5352K(19840K),
[Full GC [Tenured: 13695K->13695K(13696K), 0.0302067 secs] 19839K->19595K(19840K),
1、“[GC”或者“[Full GC”是 Minor GC 还是 Full GC ,如果是System.gc()触发的gc则为[Full GC (System)
2、“[DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,使用的GC收集器决定了区域名称,Serial收集器的新生代是“[DefNew”,ParNew收集器的新生代名称为“[ParNew”,Parallel Scavenge收集器的新生代名称为“PSYoungGen”,老年代和永久代同理。
3、5504K->640K(6144K)表示回收前新生代内存为5504K,回收后为640K;5504K->5352K(19840K)表示回收前堆使用了5504k内存,回收后使用了5352k内存。
Comments