运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区 也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区.而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品 内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操…
学习Java GC机制,可以帮助我们在日常工作中 排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序. 我们将从4个方面学习Java GC机制, 1,内存是如何分配的: 2,哪些内存需要回收: 3,在什么情况下执行GC以及执行GC的方式: 4,如何监控和优化GC机制. 先来看看[1,内存是如何分配的:],JVM内存区域的划分(运行时数据区). JVM的体系结构如下:JVM的类加载系统.执行引擎系统.垃圾回收器都是去访问  运行时数据区(即 JVM虚拟内存). Java内…
虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 有不少 Java 开发人员一提到 Java 内存结构,就会非常粗粒度地将 JVM 中的内存区理解为仅有 Java 堆(heap)和 Java 栈(stack)?为什么? 首先栈是运行时的单位,而堆是存储的单位. 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆…
方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈.堆.方法区的交互关系 下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存放在 Java 栈的局部变量表中 new Person():存放在 Java 堆中 方法区的理解 <Java 虚拟机规范>中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操作系统的进程),一个进程对应着一个JVM实例.而一个JVM实例就对应着一个运行时数据区,则其中就包含着一个堆空间.一个进程中的多个线程共享这个堆空间. 几乎所有的对象实例和数组都在堆上分配内存(并非所有的对象都是在堆上分配内存,后面会提到这一特殊情况),即堆空间存储着绝大部分的对象.虚拟机栈中的栈帧…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在执行Java程序时,会把它所管理的内存划分为不同的数据区域,即运行时数据区.有些数据区域是线程共享的,即这些区域会随着虚拟机的启动而创建,随着虚拟机的关闭而销毁.而另一些区域则是与线程对应,属于线程私有的.这些区域会随着线程开始而创建,随着线程的结束而销毁. 具体的划分如下: 多个线程共享的:堆.方…
一.虚拟机栈背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 二.内存中的堆与栈 栈是运行时的单位,而堆是存储的单位:即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 栈空间存放 基本数据类型的局部变量,以及引用数据类型…
目录 运行时数据区域 总览 概念扫盲 什么是栈帧(Stack Frame) JVM常见出现两种错误 程序计数器 虚拟机栈 结构 局部变量表 方法是如何调用的 本地方法栈 堆 浅堆和深堆 堆的细分 方法区 方法区和永久代的关系 为什么要将永久代替换为元空间 ? 运行时常量池 直接内存 总结 运行时数据区域 总览 JDK. 1.7 之后版本略有不同 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域. 有必要深入了解这块的内容,因为它将决定服务器性能,除此之外还…
一.内存与线程 内存: 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行.不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁.另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创…
堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域. Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了.是 JVM 管理的最大一块内存空间. 堆内存的大小是可以调节的. <Java 虚拟机规范>规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的. 所有的线程共享 Java 堆,在这里还可以划分线程私有…