JVM体系结构
class --- 类加载系统 --- 方法区,堆内存,java栈,pc寄存器,本地方法区 --- GC,JIT compiler
Java堆内存
在运行时,Java的实例被存放在堆内存区域。当一个对象不再被引用时,满足条件就会从堆内存移除。在垃圾回收进程中,这些对象将会从堆内存移除并且内存空间被回收。堆内存以下三个主要区域:
新生代(Young Generation)
HotSpot JVM把新生代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
什么对象不再被引用
从根节点开始不可触及(软可触及,弱可触及,影子可触及)的对象,其中软可触及,弱可触及根据虚拟机内存状态
根节点:
虚拟机栈中引用的对象,本地方法区中引用的对象,方法区静态属性或常量引用的对象。
GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量)中。
虚拟机、本地方法栈这都是局部变量,某个方法执行完,某些局部使用的对象可以被回收。
jvm运行时内存划分
线程私有:
虚拟机栈,(一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有局部变量表、操作站、动态链接、方法出口等,当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。在局部变量表中,只有long和double类型会占 用2个局部变量空间(Slot,对于32位机器,一个Slot就是32个bit),其它都是1个Slot。需要注意的是,局部变量表是在编译时就已经确定 好的,方法运行所需要分配的空间在栈帧中是完全确定的,在方法的生命周期内都不会改变。虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);不过多 数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,知道内存不足,此时,会抛出 OutOfMemoryError(内存溢出)。每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。)
本地方法区,
程序计数器(程序计数器只是记录当前指令地址,域中唯一一个没有定义OutOfMemoryError的区域)
线程共享:
共享方法区,
堆区
垃圾收集:
共享方法区回收
无用的类需要满足3个条件:
(1)该类所有的实例都已经被回收,即Java堆中不存在该类的任何实例;
(2)加载该类的ClassLoader已经被回收;
(3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述3个条件的无用类进行回收,此处仅仅是“可以”
堆回收
回收算法:
标记-清除法:
缺点:效率比较低(全堆对象遍历),有内存碎片问题
复制算法:
缺点:浪费了一半的内存,当对象存活率高时,对象都复制一遍,并将所有引用地址重置一遍的代价将不可忽视
优点:适合新生代对象存活率低的内存区域,但是要浪费一半空间
标记-压缩法:
缺点:效率不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。维护一个地址表,产生额外消耗
适合老年代内存区算法
gc收集器
jdk9 默认G1
http://blog.csdn.net/yuan_xw/article/details/51443691
- 大小: 240.4 KB
分享到:
相关推荐
Java的JVM(Java Virtual Machine)是Java程序运行的基础,它是一个虚拟的...掌握这些JVM相关知识点,不仅能够帮助Java开发者在面试中脱颖而出,也能在实际开发中更好地调试和优化应用程序,提高软件性能和稳定性。
jvm相关知识点思维导图
JVM(Java虚拟机)是Java程序的运行环境,它是一个虚拟的计算机,负责将Java字节码解释成机器码并执行。JVM提供了内存管理、垃圾回收、安全性等功能,使得Java程序具有跨平台性。JVM的结构包括类加载器、解释器、...
Java虚拟机(JVM)是Java程序的核心,它负责运行Java字节码并管理程序的内存。JVM的架构包含了四个主要部分:类装载子系统(Class Loader)、执行引擎(Execution Engine)、运行时数据区(Runtime Data Area)以及...
JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你...Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在
本文将深入探讨JVM内存分配与回收策略的关键知识点。 1. 对象分配策略: - **Eden区分配**:大多数新创建的对象首先会被分配到Eden区。当Eden区的空间不足时,会触发Minor GC,清理不再使用的对象,存活的对象将被...
JVM的基础知识涵盖了其内存模型、垃圾回收机制、线程模型等多个方面,下面将详细总结这些基础知识。 ### JVM内存模型 JVM内存模型主要可以分为线程共享区域和线程私有区域。 **线程共享区域** 1. 堆(Heap):...
本文根据《深入理解Java虚拟机》书籍内容及作者理解,总结了JVM相关的知识点,分享如下: 一、JVM内存区域 JVM在运行时,将内存空间分为若干个区域,主要包括方法区、堆内存、虚拟机栈、本地方法栈、程序计数器五...
### JVM知识图谱详解 #### 一、JVM概述与讲师介绍 - **JVM**:Java Virtual Machine,是运行Java字节码的虚拟机环境。 - **讲师介绍**:本课程将由具有多年Java开发经验及JVM研究背景的专业讲师主讲。 #### 二、...
总结来说,理解和掌握JVM内存区域的划分以及如何避免内存溢出是Java开发中至关重要的知识点,这有助于优化程序性能和解决运行时的内存问题。通过深入学习JVM的内存管理机制,开发者可以更好地控制和调优Java应用程序...
了解和掌握这些JVM相关知识,对于优化Java应用的性能、避免内存泄漏以及解决问题具有重要意义。在实际工作中,开发者可以根据应用程序的需求,通过调整JVM参数来达到最佳的运行效果。同时,利用各种监控工具,如...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作...这本《JVM工作原理学习笔记》应包含了这些内容的详细讲解,对于学习和提升JVM相关知识极具价值。
### JVM基础知识及性能调优 #### 一、JVM架构概览 Java虚拟机(JVM)作为Java程序运行的基础环境,其内部结构复杂且高效。理解JVM的基础知识对于优化Java应用程序至关重要。JVM主要由以下几个关键部分组成: 1. **...
Java虚拟机(JVM)是Java...掌握这些JVM相关知识对于Java开发人员尤其重要,它们不仅出现在面试中,也是解决实际问题、提升程序性能的关键。理解JVM的工作原理和优化技巧,可以使你编写出更高效、更稳定的Java代码。
Java虚拟机(JVM)是Java程序运行的基础,它提供了内存管理、类...理解这些JVM知识点对于优化Java应用性能、排查内存泄漏等问题至关重要。通过不断学习和实践,开发者可以更好地驾驭JVM,确保Java程序高效稳定地运行。
通过深入学习和实践这些JVM相关知识,可以更好地理解和解决Java程序中的性能问题,提升系统的稳定性和效率。对于初学者来说,这是一个很好的起点,逐步掌握JVM将有助于成为一名优秀的Java开发者。
【JVM面试题详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行Java应用程序并提供跨平台的兼容性。...对于Java开发人员来说,不断学习和实践JVM相关知识,是提升自身技能的重要途径。
本篇文章将深入探讨JVM的基础知识,包括它的架构、内存模型、类加载机制以及垃圾收集等核心概念。 首先,JVM的架构主要包括以下几个部分: 1. **类加载器(ClassLoader)**:负责加载类文件到JVM中。类加载器分为...
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在...