|
线程 |
概述 |
程序计数器 |
线程私有
随线程生,随线程死. |
1.每个线程分配一个独立的计数器. 2.用来记录需要执行的下一个指令. 3.在处理器内部. |
Java虚拟机栈 |
线程私有 随线程生,随线程死.
配置: -XSS |
Java方法执行的内存模型
1. 存取速度快. 2. 位于 ram(内存) 3. 栈帧: 每个方法有独立的栈帧, 保存上下文数据. 栈帧分三部分, 1)局部变量区: 数字数组下标访问. 调优: 虚拟机将当前对象通过this作为参数,通过局部变量区传递给当前方法. 引用当前对象, 局部变量通过手动置null, 防止对象逃逸. 2)操作数栈, 先进先出的队列, push,pop 3)帧数据区: 1.解析常量池的数据 2.处理方法返回,恢复调用现场 3.处理异常 |
本地方法栈 |
线程私有 随线程生,随线程死. |
1.管理本地方法的调用, 本地方法是用C实现的. 2.不放入java栈,直接调用. 2.HotSpot 不区分本地方法栈和虚拟机栈 |
Java堆 |
线程共享 |
1.位于RAM中 2.存方java对象 3.动态分配内存, 线程共享,可以划分线程私有缓冲区.(thread loacl ....) 4. 年轻代,老年代 |
方法区 |
线程共享 |
1.重要保存类的元数据: 类的类型信息,static变量,常量池,域信息,方法信息 2.永久代 实现了 方法区 3.逐渐把永久代的东西转向本地内存规划.(1.7把字符串常量池移到本地内存) |
直接内存 |
线程共享 |
|
逃逸分析
逃逸分析的基本行为就是分析对象动态作用域:
当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
包括:
1.全局变量赋值
2.方法返回值
3.实例引用传递
如果能够通过逃逸分析确定某些对象不会逃出方法之外,那就可以让这个对象在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。
垃圾回收
垃圾回收器选择:
Serial收集器:是一个单线程的收集器,标记-整理。
ParNew收集器:其实就是Serial收集器的多线程版本,标记-整理。
Parallel Scavenge收集器:复制算法的收集器,又是并行的多线程收集器。目标则是达到一个可控制的吞吐量(参数可配)。
CMS(Concurrent Mark Sweep)收集器:是一种以获取最短回收停顿时间为目标的收集器。“标记—清除”算法。
G1(Garbage-First)收集器:并行与并发,分代收集,空间整合,可预测的停顿(参数可配)。