JVM--02
Java虚拟机内存管理:
共享:
方法区:存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
java堆:存储对象实例
线程独占区:
虚拟机栈:存放方法运行时所需的数据、成为栈帧
本地方法栈:为jvm所调用到的Nativate即本地方法服务
程序计数器:记录当前线程所执行到的字节码的行号
程序计数器:
较小的内存区域 当前线程所执行的字节码行号指示器
如果是java方法 记录当前字节码指令的地址 如果是native方法 值为undefined 没有oom异常的区域
goto java中唯一的一个保留字
虚拟机栈:
java方法执行的动态内存模型
栈帧:
每个方法执行,都会创建一个栈帧,伴随方法创建到执行完成。存储局部变量表、操作数栈、动态链接、方法出口等。
局部变量表:
存放编译器可知的各种基本数据类型,引用类型,returnAddress类型 64位的long 和double占用两个slot(局部变量空间)其余只占用一个
局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,运行期间不会改变局部变量表的大小。
大小:
如果线程请求的栈深度大于虚拟机所允许的深度,将发生Stack Overflow 例如递归方法没有出口
如果扩展时无法申请到足够的空间将发生oom
本地方法栈:
本地方法栈为虚拟机使用到的native方法服务
也会出现 Stack Overflow和oom
Java堆:
存放对象实例
jvm管理的最大的内存区域
垃圾收集器管理的主要区域
新生代、老年代、Eden空间
(逃逸分析、栈上分配、标量替换)
OOM异常
方法区:(非堆 Non-heap)
线程共享
存储虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据
类版本 字段 方法 接口
方法区和永久代
垃圾回收在方法区的行为:针对常量池的回收和类型的卸载
异常的定义:OOM
常量池:(运行时常量池 方法区的一部分)
存放编译期生成的各种字面量和符号引用,将在类加载后进入方法区的运行时常量池中存放
也会把翻译出来的直接引用存放到运行时常量池中
运行期间也可以将新的常量放入常量池中 String类的intern方法
OOM异常
intern方法是native方法
直接内存:(Direct Memory)
不是jvm的一部分
OOM异常
NIO (New Input/Output):引入一种基于通道与缓冲区的I/O方式 使用native函数库直接分配堆外内存,通过一个存储在java heap中的DirectByteBuffer对象作为这块内存的引用进行操作
由DirectMemory导致的内存溢出,在heap dump文件中不会看到明显的异常
java对象的结构:
Header(对象头)
自身运行时数据(Mark Word):hash值 GC分代年龄 锁状态标志 线程持有的锁 偏向线程id 偏向时间戳
类型指针:数组(还有一个记录数组长度的数据) 指向对象元数据的指针
InstanceData:
long、double分在一起 short。char分到一起 相同长度分一起
Padding
占位符
对象创建:分配空间
指针碰撞:Serial、ParNew等使用compact过程的收集器
空闲列表:CMS 基于Mark-Sweep算法
对象访问定位:
通过栈上的reference数据操作堆上的具体对象
使用句柄:java堆中划分出句柄池 保存实例对象的地址 java栈中的引用地址不需要改变 只改变句柄池
使用指针 hotspot采用的方式:直接指针 速度快
到对象实例的指针和到对象类型数据的指针
JVM--02的更多相关文章
- 02 Java类的加载机制
1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- java反射(2)+Class.forName( )
在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢? 其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映 ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- 02 JVM 从入门到实战 | 什么样的对象需要被 GC
引言 上一篇文章 JVM 基本介绍 我们了解了一些基本的 JVM 知识,本篇开始逐步学习垃圾回收,我们都知道既然叫垃圾回收,那回收的就应该是垃圾,可是我们怎么知道哪些对象是垃圾呢? 哪些对象需要被回收 ...
- Java 知识笔记 - 类、集合、多线程、IO、JVM(最后一次更新,2019年02月17日)
目录 Class 内部类.静态内部类.匿名内部类.局部内部类 Collection Java Collection Set Queue Map Collections Arrays System Co ...
- 【JVM】02垃圾回收机制
垃圾回收 垃圾回收策略https://blog.csdn.net/u010425776/article/details/51189318 程序计数器.Java虚拟机栈.本地方法栈都是线程私有的,也就是 ...
- 02 jvm简介
声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...
- 02. JVM运行机制
JVM运行机制 JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...
随机推荐
- Java内存模型知识点小结---《深入理解Java内存模型》(程晓明)读书总结
一.Java内存模型介绍 内存模型的作用范围: 在Java中,所有实例域.静态域和数组元素存放在堆内存中,线程之间共享,下文称之为“共享变量”.局部变量.方法参数.异常处理器等不会在线程之间共享,不存 ...
- 互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿
有了人的地方,就会有江湖. 有江湖的地方,就会有门派. 有门派的地方,就会有纷争. 有纷争的地方,就会有兴衰. 2018年马上就要离我们远去了,迎接我们的将会是新的一年——2019年.在整个过去的20 ...
- python list 中 remove 的骚操作/易错点
在过去的某一天(2019.3.19),有个学弟问了一个关于python list中的一个问题: 比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素. 我们尝试了如下几种方 ...
- pyspider爬虫框架webui简介-爬取阿里招聘信息
命令行输入pyspider开启pyspider 浏览器打开http://localhost:5000/ group表示组名,几个项目可以同一个组名,方便管理,当组名修改为delete时,项目会在一天后 ...
- photoshop快速把新照片制作成老照片教学
原图 步骤1 在photoshop中找开需要处理的图片,Ctrl+J复制图片,得到图片1. 步骤2 单击图层面板底部的创建新的填充或调整图层图标,添加色调/饱和度调整图层.调整它的饱合度和明度. 步骤 ...
- JEECG 3.8宅男优化版本发布
1024程序员节宅男节日快乐 -- JAVA快速开发平台,JEECG 3.8宅男优化版本发布 - JEECG开源社区 - CSDN博客https://blog.csdn.net/zhangdaisco ...
- mysql-笔记--增删改查
查看数据库:可以使用 show databases; 命令查看已经创建了哪些数据库 指定数据库:在登录后使用 use 语句指定, 命令: use 数据库名;要对一个数据库进行操作, 必须先选择该数据库 ...
- springboot 集成swagger
了解到swagger 就记录下用法 pom.xml <dependency> <groupId>io.springfox</groupId> <artifac ...
- CCProxy使用说明
CCProxy:通过手机调试webservice工具 第一步配置,点击设置 弹出如下页面点击E 弹出如下页面 配置端口,点击确定配置完成!! c#项目在路径为DCYS\.vs\config下找到文件a ...
- Nginx 11阶段的顺序处理
L49