JVM基本知识总结
大概两三个月之前阅读了《深入理解Java虚拟机》(周志明著),也为了加深印象,这里简单的做下总结,想完整点了解JVM知识的也可以阅读本书,书写的不错,相当通俗易懂。
第一部分 内存管理机制:
Java内存区域与内存溢出:
Java内存区域分为堆、栈(Java虚拟机栈和本地方法栈,不过对于hotspot来讲,是一致的)、方法区、程序计数器、直接内存区域(NIO的allocateByDireactMemory)等。借用@兰亭风雨 的图片一张
其中方法区用于加载类信息、常量、静态变量、即时编译器编译后的代码等数据的存储(运行时常量池也是方法区的一部分,Class文件的结构包括魔数、版本号、域、接口、方法等信息,常量池(Class文件常量池),用于存放编译器生成的各种字面量和符号引用)、堆区用于存放对象实例、栈的话通过压入或者弹出栈帧来控制程序,每个方法被执行的时候都会同时创建一个栈帧,一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
内存溢出异常可以发生在栈、方法区、以及堆区(又被成为GC堆)。栈区如果发生溢出,可能是由于栈深度超出或者是线程栈的数量太多。方法区溢出原因可能是动态生成大量类或者是使用了String.intern()方法,堆区是可能由于new了大量的对象。
JVM垃圾回收:
要回收一个对象,首先要判断该对象是否无用,有两种方法:引用计数法和图的可达性分析(GC ROOTS:栈帧中的引用对象、方法区静态常量引用对象、本地方法引用对象)的方法。其中引用分四个类别:强引用、软引用、弱引用、影子引用(虚引用),引用强度依次减弱。JVM垃圾回有三种算法,复制、标记删除、标记整理,同时采用分代分代算法,基本上Young代采用复制,Old代采用标记删除或者整理。安全点(safepoint),JVM只有执行到安全点才会进行GC工作,安全点一般在方法调用、循环跳转、异常跳转等,有两种方法使得程序跑到安全点,分为抢占式和主动式。
Hotspot的垃圾收集器不算G1的话有6种,其中Serial(串行)、ParNew、Parallel作用于新生代,CMS、Serial Old、Parallel Old作用于老年代。具体的内容有空再补充上。基本上Web服务器采用CMS+ParNew的组合,降低响应时间。CMS的四次标记过程也是需要记住的,分别是初始标记、并发标记、重新标记、并发清楚。
JVM基本知识总结的更多相关文章
- JVM 基础知识
JVM 基础知识(GC) 2013-12-10 00:16 3190人阅读 评论(1) 收藏 举报 分类: Java(49) 目录(?)[+] 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看 ...
- JVM基础知识(1)-JVM内存区域与内存溢出
JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...
- JVM相关知识
Java虚拟机学习分享最近主要在学习JVM相关知识,-知识主要来源<深入理解JAVA虚拟机>,深有感触,结合自己的理解,整理出一些经验,由于篇幅较长,就把链接帖出来,希望对大家有所帮助: ...
- JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)
1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...
- JVM基础知识总结
因为没深入搞底层研究,所以也就没做很细致的笔记.相关笔记内容是直接从度娘那儿来的,重新删减.整理和加了点自己的东西. 1.JVM(Java Virtual Machine)是什么:JVM是一种用于计算 ...
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- Java-100天知识进阶-JVM内存-知识铺(三)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. Java内存模型(JMM) JVM内存模式是JVM的内存分区 Java内存模式是一种虚 ...
- JVM虚拟机知识问答总结(简单复习,快速回忆!)
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- JVM基础知识
JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.J ...
随机推荐
- JMeter AI图片识别接口并发量测试
由于临时接到一个性能测试任务,测试8个独立接口在实验室环境的TPS.响应时间以及服务器性能监控如CPU.内存.IO等,没有明确具体的响应时间与并发数,需求较模糊. 1.软件.硬件环境信息:JMeter ...
- No parameter name specified for argument of type
在使用SpringMVC绑定基本类型(如String,Integer等)参数时,应通过@RequestParam注解指定具体的参数名称,否则,当源代码在非debug模式下编译后,运行时会引发Handl ...
- Neo4j:Index索引
Indexing in Neo4j: An Overview by Stefan Armbruster · Jan. 06, 14 · Java Zone Neo4j是一个图数据库,在做图的检索时,用 ...
- C预处理之宏定义
#include <stdio.h> //定义不带参数的宏 #define PI 3.14 /*********************************************** ...
- box-shadow单侧投影,双侧投影,不规则图案投影
底部投影box-shadow: 0 5px 4px -4px black; 底部右侧投影 3px 3px 6px -3px black 两侧投影 box-shadow: 7px 0 7px -7px ...
- angularJs input框绑定ng-model后js获取不到问题
搬运自:https://blog.csdn.net/fenglongmiao/article/details/81545993 与其他指令一样,ng-controller指令也会创建一个子级作用域,因 ...
- 框架集 frameset
框架集和内联框架的作用类似,都用于在一个页面中引入其他的外部的页面 框架集可以同时引入多个页面,而内联框架引入一个, 在h5标准中,推荐使用框架集,而不使用内联框架 使用 frameset 来创建一个 ...
- jq-demo-点击选择(英雄联盟)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- EF批量添加数据之修改SQL Server执行上限
asp.net core 项目 打开Startup.cs services.AddDbContext<MyContext>( options => { options.UseSqlS ...
- leetcode-168周赛-1296-划分数字为连续数字的集合
题目描述: 自己的提交: class Solution: def isPossibleDivide(self, nums: List[int], k: int) -> bool: c = col ...