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 ...
随机推荐
- java程序中线程cpu使用率计算
原文地址:https://www.imooc.com/article/27374 最近确实遇到题目上的刚需,也是花了一段时间来思考这个问题. cpu使用率如何计算 计算使用率在上学那会就经常算,不过往 ...
- svn 类似.gitignore功能实现
svn propset -R svn:ignore -F .cvsignore .
- UVA 10005 Packing polygons(最小圆覆盖)
裸的模板题 AC代码: #include<cstdio> #include<cmath> #include<algorithm> #include<iostr ...
- Install .NET Core Runtime on Linux Ubuntu 16.04 x64
原文链接https://www.microsoft.com/net/download/linux-package-manager/ubuntu16-04/runtime-current nstall ...
- linux 查看服务器序列号(S/N)
[root@node1~]# dmidecode -t 查看支持的参数 dmidecode: option requires an argument -- 't' Type number or key ...
- Python全栈开发:Javascript
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...
- Tools: geos 使用指南
1. 下载geos 2. 进入VS开发人员命令提示3.依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>n ...
- Ubuntu 18.04 切换使用Python3
我安装的Ubuntu 默认的python是2.7.5 python -V 我参考网上照到的文章,如果需要默认python为 python3 python命令默认是 python 3 sudo cp / ...
- Replication Controller、Replica Set
假如我们现在有一个Pod正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营活动非常成功,网站访问量突然暴增 运行当前Pod的节点发生故障了,Pod不能正常提供服务了 第一种情况,可 ...
- 28. string类中方法练习
1. 自己写trim方法 public class Demo3 { public static void main(String[] args) { System.out.println(myTrim ...