Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有助于帮我们理解Java虚拟机到底是如何解决内存问题,如果出现了内存泄露或内存溢出等方面的问题,我们也可以找到问题的解决方案. Java内存区域划分 Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个数据区域.有的区域随着虚拟机进程启动而存在,有的区域则是依赖用户线程的启动和结束而…
参考:深入理解java虚拟机一书 开始之前,我们也应当搞清楚连个概念,内存泄漏Memory Leak 内存溢出: 内存泄漏:程序中间动态分配了内存,但是在程序结束时没有释放内存,造成这部分内存不可用.与硬件无关 而内存溢出就是我们接下来要讨论的: 这篇文章的目的主要有两个: 第一:验证Java虚拟机中各个运行区域存储的内容 第二:在遇到内存溢出时能快速的根据异常信息判断是哪个区域的内存溢出 1.java堆:java堆用于存储对象实例,对象数量达到最大堆溢出 2.虚拟机栈和本地方法栈:虚拟机栈主要…
1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加载器 1. Java虚拟机所管理的内存 JVM在执行java程序的时候,它所管理的内存大致被划分为以下几种数据区域: 1.程序计数器(Program Counter Register)                                                         …
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则 – 虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variables)包括了实例字段.静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题. Java内存模型…
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能,本节将通过若干实例来验证异常发生的场景.并且会初步介绍几个与内存相关的最基本的虚拟机参数. 本节内容的目的有两个:第一,通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容:第二,希望读者在工作中遇到实际的内存溢出异常时,能根据异常的信息快速判断是哪个区的内存溢出,知道什么样的代码可能导致这些区域内存溢出,以及出现这些异常后该如何处理. 下文…
1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 线程私有的内存,生命周期与线程相同,没有方法被执行会创建一个栈帧,存储局部变量表,操作栈等信息. 每一个方法被调用直至完成,对应一个栈帧在虚拟机栈中入栈到出栈的过程. 局部变量表所需的内存空间在编译器完成分配,调用方法时在帧中分配多大的局部变量完全确定,运行时不会改变该表大小. 线程请求的栈深度大…
在本篇中,作者大量篇幅介绍了当时较为流行的垃圾回收器,但现在Java 14都发布了,垃圾收集器也是有了很大的进步和发展,因此在此就不再对垃圾收集器进行详细的研究.但其基本的算法思想还是值得我们参考学习的. 概述 第一篇笔记Java内存区域与内存溢出异常中讲到了,Java的内存划分可以分为由所有线程共享的Java堆和方法区,以及每个线程之间相互独立的程序计数器.本地方法栈.虚拟机栈.其中每个线程相互独立的部分,并不会给垃圾回收造成困难.因为随着方法.线程的结束,内存自然就释放了.因此我们垃圾收集关…
虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 JVM 会在程序第一次主动引用类的时候,加载该类,被动引用时并不会引发类加载的操作.也就是说,JVM 并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次.那么什么是主动引用,什么是被动引用呢? 主动引用 遇到 new.getstatic.putsta…
java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需要执行的字节码指令(分支.循环.跳转.异常处理都需要依赖此计数器). 多线程运行时通过此计数器在线程切换后恢复正确执行位置. 是 5 个区域中唯一不会出现 OOM 的区域. 执行 Java 方法和 native 方法时的区别: 执行 Java 方法时:记录虚拟机正在执行的字节码指令地址: 执行 na…
Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设计语言,Java虚拟机,javaAPI 类库这三部分统称为JDK(Java Development Kit)…