【文章阅读】Java虚拟机系列学习
总目录:
Java虚拟机 - 随笔分类 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/category/731395.html
已读:
Java虚拟机1:什么是Java - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4826691.html
注:初步了解JAVA虚拟机,只是说明介绍,没有太多实际东西。
Java虚拟机2:Java内存区域及对象 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4827590.html
注:初步讲解了堆和栈的含义,以及内存说明。后面讲了对象创建时内存的分配,以及如何对象寻址,比价重要。
Java虚拟机3:常用JVM命令参数 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4830692.html
注:主要讲了常用JVM命令参数的含义。
Java虚拟机4:内存溢出 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4833713.html
注:主要讲了内存溢出:堆溢出、栈溢出,以及方法区和运行时常量池溢出,了解一下。
Java虚拟机5:Java垃圾回收(GC)机制详解 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4836700.html
注:介绍了垃圾回收算法,垃圾收集器,以及垃圾收集的实例代码讲解,还有如何观看GC日志。如果深入学习,那么这一块很需要好好看看。
Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4839245.html
注:主要介绍概念,标题中的。其他主要讲解Client模式和Server模式的区别:主要是不同模式下使用不同的JIT编译器。
Java虚拟机7:内存分配原则 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4841177.html
注:主要讲了内存分配原则,即新建对象优先分配在新生代还是老年代,如果新生代GC或者老年代FGC,内存是如何转移的,以及一些内存分配原则说明。
Java虚拟机8:虚拟机性能监控与故障处理工具 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4842483.html
注:主要讲了查询虚拟机一些基本信息的常用命令,有了这些命令我们才能获取到虚拟机具体的状态,才能发现问题,然后解决问题。
另外,简单提了一些其他工具:JDK自带的,以及一些付费工具等。后续实际分析时可以参考。
Java虚拟机9:Java类加载机制 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4844915.html
注:类使用的7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。
每个阶段分别做了一些重要说明。不是很理解,不过可以先记着,后续需要再细看。
Java虚拟机10:类加载器 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4845144.html
注:主要介绍了类加载器,主要就是如何对类加载,是第九篇文章里加载部分的比较详细的讲解。
不做笔记,后续有需要直接看原文。
Java虚拟机11:运行期优化 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4857820.html
注:这篇文章主要详细讲了运行期优化,即JIT即时编译相关,主要是如何确定需要进行即时编译:方法调用计数器和回边计数器;另外还有编译过程中的优化技术:公共子表达式消除,数组范围检查消除和方法内联以及逃逸分析。可以简单理解一下。
Java虚拟机12:Java内存模型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4859107.html
注:这一章主要是讲了多线程相关,因为内存模型对多线程影响很大,主要想说明了两个内存:主内存和工作内存。以及两种内存之间的交互(原子性操作),以及一些交互规则。
最后,顺带说了volatile关键字的作用和synchronized关键字的作用。
还有先行发生happens-before原则:一共8个。线程之间的安全问题可以通过这八个原则来进行判断。
Java虚拟机13:互斥同步、锁优化及synchronized和volatile - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4978876.html
注:互斥是因,同步是果;互斥是方法,同步是目的。
另外主要从编译的字节码层次讲了:synchronized的实现和volatile的实现。
Java虚拟机14:Java对象大小、对象内存布局及锁状态变化 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/6928133.html
注:一个对象占多少字节,除了基本数据类型的字节数,还有不同操作系统保存对象元数据的内存。这些内容加起来,才是一个对象占用的全部字节。
还讲了JAVA的四种锁的状态:无锁态、偏向锁、轻量级锁和重量级锁。详细介绍了每种锁的优点,以及在什么情况下,锁会由次一级升级为高一级的锁。
Java虚拟机15:再谈四种引用状态 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/7082471.html
注:详细讲了JAVA的四种引用,通过实例讲解了在什么情况下,每种引用对应的对象会被回收。这才是最重要的。
Java虚拟机16:Metaspace - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8688203.html
注:介绍lMetaspace相关想基础知识,但我不是很理解,也不知道学习这些有什么用,继续加油吧~~
笔记:
对于堆栈:
- 堆是用来存放对象;
- 而栈是用来执行程序的。
垃圾回收机制:
- 4种引用状态
- 1、强引用
- 2、软引用
- 3、弱引用
- 4、虚引用
- 垃圾回收算法
- 1、标记-清除(Mark-Sweep)算法
- 2、复制(Copying)算法
- 3、标记-整理(Mark-Compact)算法
- 垃圾收集器
- 1、Serial收集器
- 新生代收集器(Client模式下:默认)
- 复制算法
- 单线程
- 2、ParNew收集器(Serial收集器的多线程版本)
- 新生代收集器(Server模式下:首选)
- 复制算法
- 多线程
- 3、Parallel收集器
- 新生代收集器(Server模式下:默认)
- 复制算法
- 多线程
- 目标:达到一个可控制的吞吐量
- 4、Serial Old收集器(Serial收集器的老年代版本)
- 老年代收集器
- 标记-整理算法
- 单线程
- 5、Parallel Old收集器(Parallel收集器的老年代版本)
- 老年代收集器
- 标记-整理算法
- 多线程
- 6、CMS收集器
- 老年代收集器
- 标记-清除算法
- 线程?
- 目标:获取最短回收停顿时间
- 7、G1收集器
- 好像忽略了新生代和老年代...跨时代
收集器分类总结:
Java虚拟机1:什么是Java - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4826691.html
注:初步了解JAVA虚拟机,只是说明介绍,没有太多实际东西。
Java虚拟机2:Java内存区域及对象 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4827590.html
注:初步讲解了堆和栈的含义,以及内存说明。后面讲了对象创建时内存的分配,以及如何对象寻址,比价重要。
Java虚拟机3:常用JVM命令参数 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4830692.html
注:主要讲了常用JVM命令参数的含义。
Java虚拟机4:内存溢出 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4833713.html
注:主要讲了内存溢出:堆溢出、栈溢出,以及方法区和运行时常量池溢出,了解一下。
Java虚拟机5:Java垃圾回收(GC)机制详解 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4836700.html
注:介绍了垃圾回收算法,垃圾收集器,以及垃圾收集的实例代码讲解,还有如何观看GC日志。如果深入学习,那么这一块很需要好好看看。
Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4839245.html
注:主要介绍概念,标题中的。其他主要讲解Client模式和Server模式的区别:主要是不同模式下使用不同的JIT编译器。
Java虚拟机7:内存分配原则 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4841177.html
注:主要讲了内存分配原则,即新建对象优先分配在新生代还是老年代,如果新生代GC或者老年代FGC,内存是如何转移的,以及一些内存分配原则说明。
Java虚拟机8:虚拟机性能监控与故障处理工具 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4842483.html
注:主要讲了查询虚拟机一些基本信息的常用命令,有了这些命令我们才能获取到虚拟机具体的状态,才能发现问题,然后解决问题。
另外,简单提了一些其他工具:JDK自带的,以及一些付费工具等。后续实际分析时可以参考。
Java虚拟机9:Java类加载机制 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4844915.html
注:类使用的7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。
每个阶段分别做了一些重要说明。不是很理解,不过可以先记着,后续需要再细看。
Java虚拟机10:类加载器 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4845144.html
注:主要介绍了类加载器,主要就是如何对类加载,是第九篇文章里加载部分的比较详细的讲解。
不做笔记,后续有需要直接看原文。
Java虚拟机11:运行期优化 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4857820.html
注:这篇文章主要详细讲了运行期优化,即JIT即时编译相关,主要是如何确定需要进行即时编译:方法调用计数器和回边计数器;另外还有编译过程中的优化技术:公共子表达式消除,数组范围检查消除和方法内联以及逃逸分析。可以简单理解一下。
Java虚拟机12:Java内存模型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4859107.html
注:这一章主要是讲了多线程相关,因为内存模型对多线程影响很大,主要想说明了两个内存:主内存和工作内存。以及两种内存之间的交互(原子性操作),以及一些交互规则。
最后,顺带说了volatile关键字的作用和synchronized关键字的作用。
还有先行发生happens-before原则:一共8个。线程之间的安全问题可以通过这八个原则来进行判断。
Java虚拟机13:互斥同步、锁优化及synchronized和volatile - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/4978876.html
注:互斥是因,同步是果;互斥是方法,同步是目的。
另外主要从编译的字节码层次讲了:synchronized的实现和volatile的实现。
Java虚拟机14:Java对象大小、对象内存布局及锁状态变化 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/6928133.html
注:一个对象占多少字节,除了基本数据类型的字节数,还有不同操作系统保存对象元数据的内存。这些内容加起来,才是一个对象占用的全部字节。
还讲了JAVA的四种锁的状态:无锁态、偏向锁、轻量级锁和重量级锁。详细介绍了每种锁的优点,以及在什么情况下,锁会由次一级升级为高一级的锁。
Java虚拟机15:再谈四种引用状态 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/7082471.html
注:详细讲了JAVA的四种引用,通过实例讲解了在什么情况下,每种引用对应的对象会被回收。这才是最重要的。
Java虚拟机16:Metaspace - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8688203.html
注:介绍lMetaspace相关想基础知识,但我不是很理解,也不知道学习这些有什么用,继续加油吧~~
对于堆栈:
- 堆是用来存放对象;
- 而栈是用来执行程序的。
垃圾回收机制:
- 4种引用状态
- 1、强引用
- 2、软引用
- 3、弱引用
- 4、虚引用
- 垃圾回收算法
- 1、标记-清除(Mark-Sweep)算法
- 2、复制(Copying)算法
- 3、标记-整理(Mark-Compact)算法
- 垃圾收集器
- 1、Serial收集器
- 新生代收集器(Client模式下:默认)
- 复制算法
- 单线程
- 2、ParNew收集器(Serial收集器的多线程版本)
- 新生代收集器(Server模式下:首选)
- 复制算法
- 多线程
- 3、Parallel收集器
- 新生代收集器(Server模式下:默认)
- 复制算法
- 多线程
- 目标:达到一个可控制的吞吐量
- 4、Serial Old收集器(Serial收集器的老年代版本)
- 老年代收集器
- 标记-整理算法
- 单线程
- 5、Parallel Old收集器(Parallel收集器的老年代版本)
- 老年代收集器
- 标记-整理算法
- 多线程
- 6、CMS收集器
- 老年代收集器
- 标记-清除算法
- 线程?
- 目标:获取最短回收停顿时间
- 7、G1收集器
- 好像忽略了新生代和老年代...跨时代
收集器分类总结:
主要是:Serial和Parallel
Serial包含3个:新生代的单线程版本(Serial收集器)和多线程版本(ParNew收集器),以及老年代的单线程版本(Serial Old收集器)
Parallel包含2个:新生代的多线程版本(Parallel收集器)和老年代的多线程版本(Parallel Old收集器)
还有两个其他:CMS收集器和G1收集器
垃圾收集器组合:
Serial+Serial Old:Client模式下的默认垃圾收集器组合;
Parallel+Serial Old:Server模式下的默认垃圾收集器组合;
Java内存模型
- 8个原子操作:
- 主内存:
- lock(锁定)
- unlock(解锁)
- read(读取)
- write(写入)
- 工作内存:
- load(载入):与主内存交互
- use(使用)
- assign(赋值)
- store(存储):与主内存交互
- volatile型变量的特殊规则
- volatile型变量的特性:
- 1、保证此变量对所有线程的"可见性"。
- 所谓"可见性"是指当一条线程修改了这个变量的值,新值对于其它线程来说都是可以立即得知的。
- volatile只保证了可见性,并不保证基于volatile变量的运算在并罚下是安全的
- 2、使用volatile变量的第二个语义是禁止指令重排序优化。
- volatile型变量的规则:
- 1、在工作内存中,每次使用某个变量的时候都必须线从主内存刷新最新的值,用于保证能看见其他线程对该变量所做的修改之后的值
- 2、在工作内存中,每次修改完某个变量后都必须立刻同步回主内存中,用于保证其他线程能够看见自己对该变量所做的修改
- 3、volatile修饰的变量不会被指令重排序优化,保证代码的执行顺序与程序顺序相同
【文章阅读】Java虚拟机系列学习的更多相关文章
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- 温故知新-java虚拟机
文章目录 java虚拟机是什么? jvm的体系结构 第一个类加载子系统 类的生命周期 加载器分类 类加载机制 第二个运行时数据区(内存结构) GC算法和收集器 如何判断对象可以被回收? 如何判断一个常 ...
- java虚拟机栈(关于java虚拟机内存的那些事)
<深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日16:26:51 目录 文章目录 java虚拟机栈是什么 特点 栈帧 局部变量表 什么时候抛出 `Sta ...
- 【Java虚拟机11】线程上下文类加载器
前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...
- Java虚拟机系列——检视阅读
Java虚拟机系列--检视阅读 参考 java虚拟机系列 入门掌握JVM所有知识点 2020重新出发,JAVA高级,JVM JVM基础系列 从 0 开始带你成为JVM实战高手 Java虚拟机-垃圾收集 ...
- JAVA虚拟机系列文章
本系列文章主要记录自己在学习<深入理解Java虚拟机-JVM高级特性与最佳实践>的知识点总结,文章内容都是基于周志明所著书籍的总结. 1.Java内存区域与溢出 2.垃圾收集器与内存分配策 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解Java虚拟机阅读心得(一)
JVM(Java Virtual Machine) 即Java虚拟机,是一种用于计算设备的规范,用于运行Java程序编译后得到的字节码文件(Class文件) 一.JVM的内存区域 1.程序计数器(Pr ...
- 深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...
随机推荐
- 如何优雅的使用RabbitMQ(转载)
RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...
- AOP - PostSharp 2.0
PostSharp是一个非常优秀的AOP框架,使用上非常方便,功能强大,对目标拦截的方法不需要做什么修改,但现在已经商业化运作从PostSharp官方网站下载一个试用版,安装 简单示例PostShar ...
- DDD~大话目录
来自:http://www.cnblogs.com/lori/p/3472789.html DDD~DDD从零起步架构说明 DDD~概念中的DDD DDD~microsoft NLayerApp项目中 ...
- js 获取距离顶部的相对高度
getTop (e) { var offset=e.offsetTop; if(e.offsetParent!=null) offset+=this.getTop(e.offsetParent); r ...
- LINQ - 在Where條件式中使用in與not in(转载)
算算時間,接觸LINQ也有一個月的時間了,可以算是落伍兼新生,不過最近在寫專案的時候,遇到了在LINQ的Where條件式中要如何使用in與 not in呢!? 這時候真的只能坐在位子上仰天長笑,開始懷 ...
- 735. Replace With Greatest From Right【medium】
Given an array of integers, replace every element with the next greatest element (greatest element o ...
- iOS网络访问之使用AFNetworking
AFNetworking是IOS上常用的第三方网络访问库,我们可以在github上下载它,同时github上有它详细的使用说明,最新的AFNetworing2.0与1.0有很大的变化,这里仅对2.0常 ...
- yii save model return id null
/** * Creates a new model. * If creation is successful, the browser will be redirected to the 'view' ...
- linux命名对文件的读写和退出
vi xxx.txt 打开就能看到里面的内容.按 i 进入编辑模式,然后就可以输入内容了,也可以移动光标到你要删除内容的位置按删除键来删除内容.编辑完后可以按 Esc(键盘左上角) 进入命令模式.然后 ...
- C语言编写的PHP框架--yaf入门编程
首先--添加dll,修改php.ini--不同的版本,不同的需求 其次,根据教程http://www.laruence.com/manual/tutorial.firstpage.html#tutor ...