JVM内存基本理解
声明:本文内容仅作为本人方便记忆和查看所用。
JVM有五块内存空间:
1、method area:用于存储已被加载的类信息、常量、静态变量、即时编译后的代码等数据。
注:在JDK8中,Method Area(方法区)即PermGen(永久代)已经废弃,取而代之的是Metaspace(元空间);Metaspace的性质与Method Area基本类似,他们的本质区别是Metaspace不在虚拟机中,而是使用本地内存,理论上取决于32位/64位系统可虚拟的内存大。
2、heap:一般存放对象实例。
3、native method stack:作用和VM stack类似。
4、program counter register:当前线程执行字节码文件行号指示器,是唯一没有OutOfMemoryError的区域。
5、vm stack:每个方法在执行的时候都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到结束对应着stacks中入栈到出栈的过程。
其中1和2为线程共享数据区,其他为线程隔离数据区。
虚拟机创建对象:
1、heap中内存规整,则使用bump the pointer(指针碰撞);一般这种方式下GC为Serial、Palnew等带有compact过程。
2、heap中内存不规整,则必须维护一张表记录哪些内存可用,在分配的时候找到一块足够大的内存,并且更新该表,这种方式称为free list(空闲列表);一般这种方式下GC为CMS这种基于Mark-Sweep。
heap是否规整取决于GC方式是否带compact功能。
修改指针线程安全问题解决:
1、对分配内存空间时做同步处理,实际上虚拟机采用CAS配上失败重试的方法保证更新操作的原子性。
2、把内存分配的操作按照线程划分的不同的空间中,即每个线程在heap中预先分配一小块内存,称为本地线程分配缓冲,内存分配完之后需要将该内存初始化为零值,然后虚拟机对对象进行必要的设置。
GC:
young generation(minor GC):大部分对象在创建之后很快就会变得不可达。包含eden和survivor区。
old generation(major GC or full GC):对象没有不可达,从新生代存活下来,被复制到老年代。
card table:用来表示老年代某一区域中的所有对象是否持有对新生代对象的引用。这样新生代在GC的时候不需要花大量时间扫描所有老年代对象来确定对象的引用关系。
GC方式:
Serial GC:单线程收集器;Serial old是针对老年代的收集器
Parnew GC:Serial 新生代的多线程实现
Parallel :采用复制算法的多线程新生代收集器,主要关注目标是吞吐量
Parallel old(Parallel Compacting GC (JDK1.6后)):使用多线程和标记整理算法的老年代收集器
Concurrent Mark & Sweep GC(CMS):应用广泛,以获取最短停顿时间为目的;以标记清除算法为基础,会产生大量的空间碎片;为解决这个问题,默认提供-XX:+UseCMSCompactAtFullCollection收集开关参数(默认开启),用于在full GC完开启内存碎片的整理过程;还提供另外一个参数-XX:CMSFullGCsBeforeCompaction用于设置执行多少次不压缩full GC后跟着来一次带压缩的(默认次数为0)
GC ROOTS:
虚拟机栈中的引用对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
Native的引用对象
GC 算法:
标记清除:问题是容易产生大量的空间碎片,提前触发full GC
标记整理:老年代算法;先标记,再压缩,后清除
复制算法:新生代算法
增量算法:垃圾收集线程和应用程序线程交替运行;优点:减少系统停顿时间;缺点:因为线程切换和上下文转换的消耗,使得垃圾回收总成本上升,造成系统吞吐量下降。
JVM内存基本理解的更多相关文章
- JVM内存简单理解
1.首先简单说一下CPU与内存之间的关系 CPU运转速度快,磁盘的读写速度远远不及CPU运转速度,所以设计了内存来缓冲CPU等待磁盘读写:随着CPU的发展,内存读写也远远跟不上CPU的读写速度,CPU ...
- JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...
- 走进JVM【二】理解JVM内存区域
引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...
- 深入理解JVM(一)——JVM内存模型
JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...
- 你应该这样理解JVM内存管理
在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...
- 深入理解JVM内存区域与内存分配
前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...
- 如何从编程的本质理解JVM内存模型
如何从编程的本质理解JVM内存模型 一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆.栈之类的概念.这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记 ...
- 深入理解JVM之JVM内存区域与内存分配
深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
随机推荐
- vue图片查看器
vue 安装图片查看器插件安装cnpm install v-viewer引用 import 'viewerjs/dist/viewer.css' import Viewer from 'v-viewe ...
- 当初对"软件工程"这个专业的期待和想象是什么?
很多期待,很多幻想 印象很深刻的初中语文老师让我们背诵的一首诗<错误>: <错误> 作 者:郑愁予 我打江南走过 那等在季节里的容颜如莲花的开落 东风不来,三月的柳絮不飞 你底 ...
- Linux上创建RStudio快捷方式
在Linux平台上经常会有一些软件需要通过命令行的方式启动,这没有图标启动方便,下面是在Linux平台为RStudio创建图标链接的方法: 下面以在桌面上创建RStudio快捷方式为例: (1) 首先 ...
- C# 基础Array
一.Array的作用 连续定义多个相同类型的变量,比如我定义1000个学生的学生年龄,int[] age = new int[1000];不需要慢慢的一个一个变量的定义,数组是不是很方便. 需要注意的 ...
- python编程:从入门到实践----第四章>操作列表
一.遍历整个列表 1-1.假设有一个魔术师名单,需要将其中每个魔术师的名字都打印出来. # 用for循环来打印魔术师名单中的名字 magicians=['alice','david','carolin ...
- Graph & Trees3 - 二分图
\[二分图略解\] \[By\;TYQ\] 二分图定义: \(f(i,L) = [a \in L\;\text{&}\;\forall b \in a.to \;\text{,}\; b \n ...
- typescript 使用的几种情况
接口的创建 可以使用 type 和 interface 来创建类型 type 特有的优点: 声明基本类型别名,联合类型,元组等类型 type S = string; type IFoo = IBar ...
- jexus+.netcore+identityserver4 部署支持ssl(https)
硬件环境: 在阿里云购买了一个centos 7 64 位服务器 软件: jexus ,dotnet core sdk 第一步安装dotnet core sdk: 先安装dotnet core sdk ...
- LeetCode No.157,158,159
No.157 Read 用 Read4 读取 N 个字符 题目 给你一个文件,并且该文件只能通过给定的 read4 方法来读取,请实现一个方法使其能够读取 n 个字符. read4 方法: API r ...
- 计算文本长度-boundingRectWithSize
- (void)viewDidLoad { [super viewDidLoad]; //新建lable控件 UILabel *lable=[[UILabel alloc]init]; labl ...