每起一个jvm实例是一个进程。一个进程下可以运行多个线程。每一个jvm中的线程在操作系统中都有一个原生线程唯一对应。JVM每一个线程启动的初始化之后会进行本地化存储,缓冲区分配,同步对象,程序计数器的操作,然后thread.run 调用本地方法区的方法调用操作系统的线程执行。线程执行结束后,操作系统线程会释放,同步释放线程占用资源。
JVM 常用的线程:
虚拟机线程,周期性人物线程,GC线程,编辑器线程,信号分发线程。
· 线程共有区域才需要垃圾回收机制(随着JVM的创建而创建,销毁而销毁),线程独有区域线程技术会自动回收不需要垃圾回收机制。
JVM的垃圾回收机制主要是作用于堆,堆主要分为新生代、老年代、永久代。JVM将GC扩展到了方法区用永久代来处理方法区。
方法区的分布:
堆内存的分布
创建一个对象如果对象大小超过某个限制就会直接进入老年代,如果不超过就会放在Eden区,如果第一次Eden区的内存占用满了,会触犯一次Minor GC ,会把不可达的的对象回收,然后将剩下的拷入SurvivorFrom 中。Eden第二次满了之后,会进行第二次Minor GC 将Eden和SurvivorFrom 同时扫描进入SurvivorTo 中,会反复的切换,这样做的好处是清理碎片化内存。
如果老年代的内存也满了会触发MajorGC 它会对老年代进行全扫描标记,然后将未标记的清除。(使用的标记算法)当老年代无法分配内存空间时,会抛出Out of Memory
永久代的数据会永久存储,java8 用元数据区代替了永久代。