Java虚拟机JVM相关知识整理
Java虚拟机JVM的作用:
Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台。
JVM的体系结构包含三个主要的子系统和一个内存区,分别是:
- 类装载子系统:定位及导入二进制class文件,校验被导入类的正确性,为类变量分配初始化内存,以及帮助解析符号引用。
- 执行引擎:执行被转载类中的方法指令。
- 自动内存管理:用于管理运行时数据区的分配和释放。
- 本地方法和库:JNI,调用本地方法,c/c++库;执行引擎所需的本地方法库。
- 运行时数据区:又叫做虚拟机内存或Java内存。其中又分为多个小区,包括:
- 程序计数器,JVM规范中定义每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,即所谓的当前方法,程序计数器用于存储当前线程正在执行的Java方法的JVM指令地址
- Java虚拟机栈,每个线程在创建是都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次Java方法调用。栈中存放基础数据类型和自定义对象的引用
- 堆,是Java内存管理的核心区域,用于存放对象实例,堆被所有线程共享,堆内空间会被不同的垃圾回收器进行进一步细分,比如新生代、老年代
- 方法区,用于存储元数据,比如类结构信息,以及对应的运行时常量池、字段、方法代码
- 本地方法栈,与Java虚拟机栈类似,用于支持对本地方法的调用,每个线程都会创建一个。
整体结构如下图所示:
更详细的运行时数据区如下图所示:
从上图可以看出一个线程中包含程序计数器、Java虚拟机栈,本地方法栈,其是私有的,堆和方法区是共享的,堆中可划分为新生代区、老年代区等,方法区中包含了运行时常量池。
Java对象是否都分配在堆上?
答:是的,虽然通过逃逸分析,JVM会在栈上分配哪些不会逃逸的对象,这在理论上是可行的,但是这完全取决于JVM设计者的选择,而最常用的Oracle hotspot JVM并未这么做,所有可以明确所有的对象实例都是创建在堆上的
堆内存不足,会抛出java.lang.OutOfMemoryError:java heap space错误,可能原因是内存泄漏问题,也有可能是堆大小设定不合理
栈内存不足,会抛出java.lang.StackOverFlowError错误,可能原因执行了一段死循环的调用代码
Jconsole可对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。它是JDK字段的监控工具,可在JDK/bin目录下找到
Java常见的垃圾回收器有哪些?
垃圾回收器是和具体JVM实现紧密相关的,不同的厂商(IBM、Oracle),不同版本的JVM提供的选择也不同,以主流Oracle JDK分析,主要包括:
①、Serial GC,串行运行;作用于新生代;复制算法;响应速度优先;适用于单CPU环境下的client模式。
②、PerNew GC,并行运行;作用于新生代;复制算法;响应速度优先;适用于多CPU环节Server模式下与CMS配合使用
③、Parallel GC,并行运行;作用于新生代;复制算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
④、Serial Old GC:串行运行;作用于老年代;标记-整理算法;响应速度优先;单CPU环境下的Client模式。
⑤、Parallel Old GC:并行运行;作用于老年代;标记-整理算法;吞吐量优先,适用于后台运算而不需要太多交互的场景。
⑥、CMS GC,并行运行;作用于老年代;标记-清除算法;响应速度优先,存在内存碎片化问题,适用于互联网或者B/S业务
⑦、G1 GC,并行运行;作用于新生代或者老年代;标记-整理算法+复制算法;响应速度优先,是一种兼顾吞吐量和停顿时间的GC实现,JDK 9以后的默认GC选择,其内存结构类似棋盘的一个个region,region之间是复制算法,但整体上实际可以看做标记--整理算法,可以有效避免内存碎片,当Java堆非常大的时候,G1更有优势,适用于服务端应用
Java虚拟机JVM相关知识整理的更多相关文章
- 了解java虚拟机—JVM相关参数设置(2)
1. JVM相关参数设置 JVM相关配置 -XX:+PrintGC 两次次YoungGC,两次FullGC. -XX:+PrintGCDetails 打印GC时的内存,并且在程序结束时打印堆内存使 ...
- Java并发编程相关知识整理
1.什么是进程.线程.多线程? 进程当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.进程间通讯依靠IPC资源,例如管道.套接字 线程是程序中的 ...
- Java集合框架相关知识整理
1.常见的集合有哪些? Collection接口和Map接口是所有集合框架的父接口 Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap ...
- JVM相关知识
Java虚拟机学习分享最近主要在学习JVM相关知识,-知识主要来源<深入理解JAVA虚拟机>,深有感触,结合自己的理解,整理出一些经验,由于篇幅较长,就把链接帖出来,希望对大家有所帮助: ...
- 深入理解java虚拟机JVM(下)
深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...
- Java虚拟机(JVM)知多少
本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...
- 深入理解java虚拟机JVM(上)
深入理解java虚拟机JVM(上) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
随机推荐
- python练习题-day8
1.有如下文件,a1.txt,里面的内容为: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并打印. wi ...
- SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑
SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC 原文:http://www.cnblogs.com/chenxizhang/arc ...
- Hash算法和一致性Hash算法
Hash算法 我们对同一个图片名称做相同的哈希计算时,得出的结果应该是不变的,如果我们有3台服务器,使用哈希后的结果对3求余,那么余数一定是0.1或者2,正好与我们之前的服务器编号相同,如果求余的结果 ...
- i++与++i区别
++i:先执行i加1,再执行语句; i++:先执行语句,再i加1; 后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人的值是原来的值: 前置自操作:先把自己改变,然后把改变后的值给别人. ...
- 010 Editor - Binary Templates
010 Editor是一款非常强大的文本/十六进制编辑器,除了文本/十六进制编辑外,还包括文件解析.计算器.文件比较等功能,但它真正的强大之处还在于文件的解析功能.我们可以使用010Edito ...
- torch随机数 manual_seed
import torch seed = 2018 torch.manual_seed(seed) torch.cuda.manual_seed(seed) a=torch.rand([1,5]) # ...
- JaCoCo在Tomcat服务器上监控代码覆盖率的使用方法
简介 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第三方的工具提 ...
- GreenDao 使用和数据库升级
1使用方法 一.添加依赖 在bulid.gradle文件下的dependencies下添加所需依赖 compile 'org.greenrobot:greendao:3.2.2' // add l ...
- Python数据分析Pandas库数据结构(一)
pandas数据结构 1.生成一维矩阵模拟数据 import pandas as pdimport numpy as nps = pd.Series([1,2,3,4,np.nan,9,9])s2 = ...
- go 编译:交叉编译&编译执行过程
1. 交叉编译 编译Windows程序和mac程序 GOOS=windows GOARCH-amd64 go build main.go 转自:https://www.cnblogs.com/mafe ...