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 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
随机推荐
- TZOJ 3134: 渊子赛马修改版
描述 赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”.在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都. 赛马是当时最受齐国贵族欢迎的娱 ...
- NOIP2018提高组初赛知识点
(传说,在神秘的初赛中,选手们经常互相爆零以示友好……) 历年真题:ti.luogu.com.cn 以下标题中打*的是我认为的重点内容 一.关于计算机 (一)计算机组成 硬件组成: 1. 控制器(C ...
- SpringBoot内置Tomcat缓存文件目录被意外删除导致异常
在项目中,一般会将文件临时保存到缓存目录 当时使用 File.createTempFile("tmp", ext, (File) request.getServletContext ...
- 有没有无痛无害的人体成像方法?OCT(光学相干断层扫描)了解一下
关于之前推送的胸片和CT有很多的小伙伴关心射线对人体的伤害的问题,在医学检查射线的强度和剂量已经有严格的标准,偶尔进行一次CT扫描是没有问题的,那么有没有一种完全无害的扫描检查呢?今天小编就给大家介绍 ...
- IP-v4&IP-v6
IPv6与IPv4区别: 1:IPv6的地址空间更大.IPv4中规定IP地址长度为32,即有2^32-1个地址: 而IPv6中IP地址的长度为128,即有2^128-1个地址. 2.IPv6的路由表更 ...
- kali蓝牙渗透
1.hcitool 通过前面讲的升级操作后,在BackTrack4 Linux或者Ubuntu系统下将会安装好蓝牙的全套操作工具,其中就包括hcitool.该工具支持大量的蓝牙设备操作,从扫描到查看设 ...
- 网络请求(I)
NSURLSession 代理方法 有的时候,我们可能需要监听网络请求的过程(如下载文件需监听文件下载进度),那么就需要用到代理方法. #import "ViewController.h&q ...
- 【Spark-core学习之一】 Spark初识
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Android Studio NDK开发环境搭建
一. 下载安装Android studio 和 NDK 二. 在Android studio中配置NDK(和SDK配置一样) 三. 用Android studio建立一个工程,打开proj ...
- uboot移植阶段二--3串口终结篇
2011-03-20 23:00:37 前天U-boot移植串口后,能成功显示数据. 今天的主要目的是再次进行U-boot移植.看是否成功.花了40分钟,很顺利. 接着就是要把之前有问题的U-boot ...