PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及StackFrame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(1)堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2)SunHotspotJVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(ThreadLocalAllocationBuffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3)TLAB仅作用于新生代的EdenSpace,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
(4)所有新创建的Object都将会存储在新生代YongGeneration中。如果YoungGeneration的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在EdenSpace。
第四块:方法区域(MethodArea)
(1)在SunJDK中这块区域对应的为PermanetGeneration,又称为持久代。
第五块:运行时常量池(RuntimeConstantPool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(NativeMethodStacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
8.JVM垃圾回收
(1)对新生代的对象的收集称为minorGC;
(2)对旧生代的对象的收集称为FullGC;
(3)程序中主动调用System.gc()强制执行的GC为FullGC。
不同的对象引用类型,GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:
(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)