学习java虚拟机笔记
虚拟机jvm
包括 类加载机制 ,运行时数据区域
运行时数据区域包括 ,程序计数器,虚拟机栈和本地方法栈,堆,方法区。
程序计数器是一块较小的内存控件, 用来指定当前字线程执行节码的行数 ,每个程序计数器都是线程私有的。
虚拟机栈,每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、方法出入口等信息。
每个方法的调用到执行过程就是一个栈帧从入栈道出栈的过程。局部变量包括基本数据、对象引用和返回地址等。
本地方法栈和虚拟机栈存的东西是一样的,只不过本地方法栈存的执行java方法的,本地方法栈存的是执行native方法的。
堆,存的是new 的对象 的实例,堆是垃圾回收的主要区域。堆里分新生代和老年代,新生代又分edan区 和两个suvive区 ,他们的比例是8比1.
方法区存的是class的构造函数,静态变量和常亮等。
垃圾回收机制: 引用记数法和可达性分析法 。
引用记数法就是 给每个对象做个标记,每多引用一次 就给该对象的标记加1 ,引用失效一次 就给该对象的标记减一,如果该对象的标记为0的话 ,则回收该对象
这种算法不能清除两个对象间互相引用的关系。
可达性分析法,是将GCRoots作为根,如果对象与GCRoots之间可以达到,有引用链 ,就证明该对象有用,否则就回收该对象。
可以作为GCRoots的 有 虚拟机栈的 数据引用,方法去里的 常亮引用和 静态变量引用。
堆中的对象清除的算法有 标记清除、标记复制和标记整理。
当一个对象被创建后首先会在eden区创建一块区域,直到当GC的时候,根据可达性算法,看一个对象是否消亡,没有消亡的对象会被放入到年轻代的suvivor区域并添
标记,消亡的直接被Minor GC kill 掉。
进入到suvivor区域的对象也不是安全的,当下一场Minor GC 来的时候还会检查Eden区域和suvivor区域中的对象是否存活,存活放入另一块suvivor区域。
当两个suvivor区域切换几次,会把标记为10的对象放入老年代,这个10 是可以设置的。
当老年区满的时候 会触发 FullGC 或则majorGC ,这个GC 会产生stop the world 现象 ,即所有的线程会被挂载起来,
一般应该尽量避免发生full gc。
标记清除 ,标记所有需要回收的对象,标记完成后统一回收。主要缺点是算法效率低,会造成不连续的空间,当存储较大对象的时候,会提前进行垃圾回收。
复制算法,主要解决效率问题,当一个空间满的时候 将存活的对象分配到另一个空间上,然后将使用的内存一次性清理掉,缺点是造成内存浪费,适用于新生代回收。
标记整理,基本过程仍与标记
强引用 : 垃圾回收器永远不会回收的引用对象。
软引用 : 描述一些有用但非必须的对象,在系统将要进行溢出前,会把这些对象列入回收对象的第二次回收。
弱引用 : 非必须的对象,比软引用更弱,软引用对象关联的对象只能生存到下一次垃圾回收之前,垃圾回收器工作时,无论内存是否足够,都会被回收。
虚引用: 完全不会对对象构成影响,也无法通过虚引用来获取对象实例,存在的目的是为了一个虚引用对象被回收时收到一个系统通知。
学习java虚拟机笔记的更多相关文章
- 开始记录学习java的笔记
今天开始记录学习java的笔记,加油
- Java虚拟机笔记(五):JVM中对象的分代
为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...
- Java虚拟机笔记(四):垃圾收集器
前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...
- Java虚拟机笔记(三):垃圾收集算法
一.标记-清除(Mark-Sweep)算法 标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想. 标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对 ...
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...
- Java虚拟机笔记(一):类加载机制
一.概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的生命周期 类从被加载到 ...
- java虚拟机笔记-1
java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚 ...
- 深入理解java虚拟机笔记Chapter12
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
随机推荐
- vCenter Server Heartbeat
1.简介 vCenter Server Heartbeat为VMware vCenter Server提供关键任务高可用性,保护虚拟基础架构免受硬件.网络.配置等的影响,基于Windows的服务,可为 ...
- 设计模式21:State 状态模式(行为型模式)
State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
- XJOI 3605 考完吃糖(DAG图dfs)
题目描述: 期末考试考完了,分数也出来了,大家准备吃糖庆祝一下,为了鼓励同学们下学期能取得更好的成绩,司马红豆同学让n个同学站成一排,如果某个同学的分数比相邻的一个同学要高,那么他得到的糖果就会比这个 ...
- [LeetCode 题解]: Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...
- Replication--将LSN转换成16进制
在复制中经常会使用到16进制的LSN,但在日志fn_dblog中的LSN是数字形式,于是从网上找到以下转换函数CREATE FUNCTION dbo.fn_convertnumericlsntobin ...
- jenkins+checkstyle
一.新增一个自由风格的项目 建好之后如下图所示 二.修改pom.xml文件 在项目根目录下添加如下代码(此处添加的3个插件) <build> <plugins> <plu ...
- .netcore 与 Docker
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客 ...
- Ocelot
Ocelot——初识基于.Net Core的API网关 Ocelot API网关的实现剖析 微服务网关Ocelot API网关Ocelot 使用Polly 处理部分失败问题 谈谈微服务中的 API 网 ...
- ASP.NET Core入门(一)
大家好,很荣幸您点了开此篇文章,和我一起来学习ASP.NET Core,此篇文字为<ASP.NET Core入门>系列中的第一篇,本系列将以一个博客系统为例,从第一行代码,到系统发布上线( ...
- Android 打开URL中的网页和拨打电话、发送短信功能
拨打电话需要的权限 <uses-permission android:name="android.permission.CALL_PHONE"/> 为了省事界面都写一起 ...