《java虚拟机》jvm内存模型,jvm优化

 

线程

概述

程序计数器

线程私有

 

随线程生,随线程死.

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)收集器并行与并发,分代收集,空间整合,可预测的停顿(参数可配)

猜你喜欢

转载自blog.csdn.net/kaige8312/article/details/83479598