JVM备忘点(1.8以前)
1.内存结构

左边两个线程共享,右边三个线程私有。
方法区:.class文件的类信息、常量、static变量、即时编译器编译后的代码(动态代理)。HotSpot将方法区称为永久代
堆:分为新生代和老年代,或分为Eden、FromSurvior、ToSurvvivor。存放了类和数组对象。当堆无法扩展且堆内没有空间分配给实例时,抛出OutOfMemoryError。
栈:由一个个栈帧组成。每次方法调用都会产生一个栈帧,调用结束后释放这个栈帧。栈帧包含了局部变量表、操作数栈、动态链接、方法出口。
局部变量表存放的是在方法中声明的8种基本数据类型、对象的引用(指向堆中的引用)、返回值的引用(也指向堆中的引用)。其中long和double占2个单位的空格键
操作数栈是栈帧内部的一个栈结构,Deolin认为它的作用是基于字节码指令进行计算,运算数被压进栈底,结果值从栈顶弹出。
动态链接,存放由.class文件中的符号引用转化而来的直接引用,这两种引用都是用来指向方法中 调用的其他方法,或是其他的域。
本地方法栈:与虚拟机栈类似,它是为Native方法服务的。
程序计数器:很小的空间,显示当前线程执行到的字节码行号。
2.类加载
-> 把.class文件以二进制的形式读到方法区
-> 在堆上创建一个java.lang.Class对象,用于封装上一步中读入的信息,让它们成为方法区内的数据结构
-> 类加载的最终产物是堆中的java.lang.Class对象
3.类的生命周期
类加载
连接
验证:检查文件格式,检查语法,比如方法内声明的final变量,不能再赋值
准备:为静态域分配内存(堆),并设置为默认初始值(无论代码中是否赋了初值,这一步都会赋诸如null, 0, 0L之类的值)
解析:把符号引用转换为直接引用
出现以下情况时,类进行初始化
创建该类的实例时(new、反射、克隆、反序列)
调用该类的静态方法,访问该类的静态域
调用java.lang.Class<该类>的方法时
main(Stirng[])方法
初始化该类的子类时
初始化
有父类的话,先初始化父类。
执行静态代码块,并为静态域分配代码层面定义的初值(这两者的顺序取决与代码中出现的先后顺序)
使用(类实例化时,紧接着初始化之后)
有父类的话,先对父类进行1.2.3.步
1.为域分配空间,初始化
2.执行构造代码块
3.构造方法
这一步结束后堆中存在了实例化后的对象,当前栈帧的局部变量变量表中存在了指向这个对象(堆中)的引用
当满足以下所有条件时,类会被卸载
该类的所有对象都被垃圾回收(GC)
加载该类的类加载器被GC
没有引用指向java.lang.Class<该类>的实例
卸载
类在方法区的数据结构被移除
4.各种数据字段在JVM中的内存位置
对象、数组 堆
基本数据类型的域 堆(因为非静态域无法独立于对象存在,所以跟对象一起在堆中,而且是线程不安全的)
基本数据类型的变量 栈(因为线程安全,栈帧出栈了以后被销毁)
final域 方法区(“常量”在方法区)
final变量 栈(这个问题在知乎问过,答案是final仅仅在编译器提供对修饰变量的约束,使其无法改变引用,但是本质与普通变量无异)
※ 总结来看,无论什么变量(在方法中申明的局部变量),都是存储在栈帧的局部变量表中的。
JVM备忘点(1.8以前)的更多相关文章
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
随机推荐
- C#projectPropertyGrid 显示结构(展开逗号分隔)
[TypeConverter(typeof(ExpandableObjectConverter))] public A MyA { get{..} set{..} }
- linux shell数值比较和字符串比较
说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较:但是把整型当成字符串进行比较,0123这些数值完 ...
- JsonObject转换失败的bug
使用过程发现初始化失败,终于找到原因 转换的字符串必须都是字符串,不能没有双引号,否则转换失败
- vue——store全局存储
业务场景:刷新页面时,首次拉取所有配置,存储到store状态管理用于全局调用: import Vue from 'vue' import Vuex from 'vuex' import userInf ...
- 谁还不知道Java String的那点事
String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现. 常问问题 面试中常被提及的String问题 String为什么是Final的 ...
- wakelock查看
Android的wakelock分为两层 待机异常https://wenku.baidu.com/view/6b765c8802020740be1e9bd8.html Linux层和应用层 查看Lin ...
- 用python文件操作实现复制图片、视频
图片复制 打开源图片: f_src = open('1.jpg','rb') 读取图片内容并存储到content变量 content = f_src.read() 打开复制后的图片,没有则创建 f_c ...
- PAT Basic 1045 快速排序 (25 分)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同的正整数的排列,请问 ...
- Fillder的前后端的应用
测试需求:有一个功能,允许用钻石兑换金币,假设1钻石=1金币,前端控制一次至少兑换10个,最多100个,后台不做验证. 测试方案:输入10,也就是告诉前端我要兑换10个金币,等前端验证通过之后,截取要 ...
- WCF 使用Stream模式进行文件上传 --节选自Packt.Net.Framework.4.5.Expert.Programming.Cookbook
使用Stream上传文件 文件上传功能是web程序/服务上常用和必须的功能,WCF也不例外.在4.0版本之前,WCF仅仅提供了buffered模式上传文件.从4.0版本之后,WCF开始提供了Strea ...