JVM(13)之 阶段回顾
各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!讲!完!了!不知道大家吸收了多少,这里我们简单的来回顾一下吧!
内存基本分为JAVA栈、本地方法栈、堆和方法区。
首先栈存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所分配的内存空间;还有一点就是他还存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息。
堆的话是存放对象和数组;在运行时动态分配内存(比如 new()),较慢,但灵活;是不连续的内存区域,在发出申请的时候,系统首先会遍历一个存有空闲地址节点的链表,找到第一个满足申请大小的节点,将他从链表删除,并分配给申请者,如果空间剩余,则将多出来的加入链表;由Java虚拟机的自动垃圾回收器来管理。分为一个Eden区和两个Survivor区。
方法区主要存放静态变量,常量,全局变量。他的大小不必是固定的,jvm可以根据应用的需要动态调整,同样方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)中分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找一个类,在该类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程需要等待。
本地方法栈则是为执行Native方法服务,但这个在不同JVM内有不同的内部实现,比如在HotSpot JVM中Java虚拟机栈和本地方法栈被实现为同一个栈区。
对于收集方法来说一般有两种,“复制”和“标记-清除-整理”。“复制”算法需要留有部分空间用于复制后的存储,适用于朝生夕死的对象;“标记-清除-整理”适用于年老代,清除后形成逻辑上连续的区域,避免了内存碎片。
对象被回收之前都要先被标记为可回收的对象,一般有引用计数和可达性分析法。JAVA采用的则是可达性分析,从“GC Roots”开始组建一张张的关系网,不在关系网上的就会被清除。标记有两次,因为被标记后还可能会执行finalize()方法。“GC Roots”被记录在OopMap中,能够让虚拟机快速的得到他们,不用遍历整个堆来寻找“GC Roots”了。
回收的时候需要暂停程序的所有线程,这个过程叫做STW,我们的程序需要优化的时候,缩短STW也是优化的一部分。
各种收集器都为缩短STW的时间提供了不同的策略,并行的、串行的,作用于年轻代的,作用于年老代的,还有作用于整个堆的。各有各的优劣势,需要搭配使用,不能随意组合。
好啦,这一整块我们算是大概回忆完啦,在后面的博文中我们就要开始讲虚拟机中的类加载机制了!
JVM(13)之 阶段回顾的更多相关文章
- alhpa阶段回顾
说明:本次课程,大家按照我下面列出来的问题进行回顾和反思,总结alhpa阶段以来的得失.每个组都要回答这些问题.由组长或者组员来回答都可以.目的依然是让大家养成软工的一些习惯和思维方式. 1.最初的需 ...
- [译]Stairway to Integration Services Level 13 - SSIS 变量回顾
介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...
- jvm(13)-线程安全与锁优化(转)
0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 ...
- jvm(13)-线程安全与锁优化
[0]README 0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概 ...
- 深入理解JVM(学习过程)
这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. 2020年02月06日22:43:0 ...
- JVM基础系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
- JVM垃圾回收(四)- GC算法:实现(1)
GC算法:实现 上面我们介绍了GC算法中的核心概念,接下来我们看一下JVM里的具体实现.首先必须了解的一个重要的事实是:对于大部分的JVM来说,两种不同的GC算法是必须的,一个是清理Young Gen ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- JVM学习——类加载机制(学习过程)
JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...
随机推荐
- [NOIP2009]最优贸易(图论)
[NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...
- Java 静态方法、私有方法、常量的使用
1.静态方法 2.私有方法 3.常量 4.接口小结
- JFreeChart使用
最近项目需要做图形分析,就想到了使用JFreeChart,之前也没有使用过,就现学先用吧.本文主要记录一些主要的代码及学习使用过程. 使用JFreeChart步骤: 一.下载JFreeChart.ja ...
- 漫谈五种IO模型
阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意 ...
- wine安装与配置
1. 安装wine32dpkg --add-architecture i386 && apt-get update && apt-get install wine3 ...
- js事件循环机制
本文参考链接:https://www.jianshu.com/p/cf47bc0bf2ab 一.先搞懂两个东西:堆和栈 栈由操作系统自动分配释放,用于存放函数的参数值.局部变量等一些基本的数据类型,其 ...
- unique && stl的全排列
stl的全排列: 看代码. #include<iostream> #include<cstdio> #include<algorithm> #include< ...
- [CSP-S模拟测试]:柱状图(树状数组+二分+三分)
题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...
- DataTable 转Json格式C#代码
/// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...
- Nodejs - 交互式管理 Node.js 版本
n - npm:Interactively Manage Your Node.js Versions. Unfortunately n is not supported on Windows. npm ...
