专业的徐州网站建设,php网站后台怎么登陆,网站建站建设网站,wordpress官网中文版下载程序计数器 多线程时#xff0c;当线程数超过CPU数量或CPU内核数量#xff0c;线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有要有一个独立的程序计数器#xff0c;记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法#xff0c;计数器记录正…程序计数器 多线程时当线程数超过CPU数量或CPU内核数量线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有要有一个独立的程序计数器记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法计数器记录正在执行的java字节码地址如果执行的是native方法则计数器为空。
虚拟机栈
线程私有的与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度递归多少层次或嵌套调用多少层其他方法-Xss参数可以设置虚拟机栈大小。栈的大小可以是固定的或者是动态扩展的。如果请求的栈深度大于最大可用深度则抛出stackOverflowError如果栈是可动态扩展的但没有内存空间支持扩展则抛出OutofMemoryError。
使用jclasslib工具可以查看class类文件的结构。下图为栈帧结构图 本地方法区
和虚拟机栈功能相似但管理的不是JAVA方法是本地方法本地方法是用C实现的。 JAVA堆
线程共享的存放所有对象实例和数组。垃圾回收的主要区域。可以分为新生代和老年代(tenured)。
新生代用于存放刚创建的对象以及年轻的对象如果对象一直没有被回收生存得足够长老年对象就会被移入老年代。
新生代又可进一步细分为eden、survivorSpace0(s0,from space)、survivorSpace1(s1,to space)。刚创建的对象都放入eden,s0和s1都至少经过一次GC并幸存。如果幸存对象经过一定时间仍存在则进入老年代(tenured)。 方法区
线程共享的用于存放被虚拟机加载的类的元数据信息如常量、静态变量、即时编译器编译后的代码。也成为永久代。如果hotspot虚拟机确定一个类的定义信息不会被使用也会将其回收。回收的基本条件至少有所有该类的实例被回收而且装载该类的ClassLoader被回收 垃圾回收算法 标记-清除算法(Mark-Sweep)
从根节点开始标记所有可达对象其余没标记的即为垃圾对象执行清除。但回收后的空间是不连续的。 复制算法(copying)
将内存分成两块每次只使用其中一块垃圾回收时将标记的对象拷贝到另外一块中然后完全清除原来使用的那块内存。复制后的空间是连续的。复制算法适用于新生代因为垃圾对象多于存活对象复制算法更高效。在新生代串行垃圾回收算法中将eden中标记存活的对象拷贝未使用的s1中s0中的年轻对象也进入s1如果s1空间已满则进入老年代这样交替使用s0和s1。这种改进的复制算法既保证了空间的连续性有避免了大量的内存空间浪费。 标记-压缩算法(Mark-compact)
适合用于老年代的算法存活对象多于垃圾对象。
标记后不复制而是将存活对象压缩到内存的一端然后清理边界外的所有对象。 JVM参数 -XX:PrintGCDetails 打印垃圾回收信息 -Xms 为Heap区域的初始值线上环境需要与-Xmx设置为一致否则capacity的值会来回飘动
-Xmx 为Heap区域的最大值
-Xss或-ss 线程栈大小指一个线程的native空间1.5以后是1M的默认大小
-XX:PermSize与-XX:MaxPermSize 方法区永久代的初始大小和最大值但不是本地方法区
-XX:NewRatio 老年代与新生代比率
-XX:SurvivorRatio Eden与Survivor的占用比例。例如8表示一个survivor区占用 1/8 的Eden内存即1/10的新生代内存为什么不是1/9因为我们的新生代有2个survivor即S1和S22。所以survivor总共是占用新生代内存的 2/10Eden与新生代的占比则为 8/10。
-XX:MaxHeapFreeRatio GC后如果发现空闲堆内存占到整个预估的比例小于这个值则减小堆空间。
-XX:MinHeapFreeRatio GC后如果发现空闲堆内存占到整个预估的比例大于这个值则增大堆空间。
-XX:NewSize 新生代大小 参考文章