深入理解JVM
深入理解Jvm笔记
正义啊
安卓工程师
展开
-
深入理解JVM:HotSpot虚拟机对象探秘
一、对象的创建过程Java是一门面向对象的变成语言,在程序运行过程中无时无刻都有对象的创建。在语言层面上创建一个对象仅需要一个new关键而已,而在虚拟机中,对象(指普通对象,不包括数组和Class对象等)的创建又是怎样的过程呢?1、类加载检查当虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行类的加载过程注:常量池指的是运行时常量池,类加载后,在方法区的运行时常量池中存放。存放原创 2020-11-09 21:43:37 · 214 阅读 · 0 评论 -
深入理解JVM:Java内存模型与线程、线程安全及锁优化
七、Java内存模型与线程Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。1、Java内存模型1.1、主内存与工作内存Java内存模型规定了所有的变量都存储在主内存中。每条线程都有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程变量所有的操作(读取、赋值等)都必须在工作内存中进行,而不能直接读取主内存中的变量。线程间变量原创 2020-10-12 22:44:58 · 295 阅读 · 0 评论 -
深入理解JVM:类加载机制
加载—>校验—>准备—>解析—>初始化虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。3.1、加载-> 查找并加载类的二进制数据。加载是“类加载”(Class Loading)过程的一个阶段,虚拟机需要完成一下3件事:通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的jav原创 2020-10-09 23:22:55 · 289 阅读 · 2 评论 -
深入理解JVM:Class文件结构
Class文件是一组以8位字节为基础单位的二进制字节流,各个数据项目按照严格顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有间隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。存储格式:Class文件采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表无符号数:无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1个字节、原创 2020-09-02 22:29:05 · 206 阅读 · 1 评论 -
深入理解JVM:垃圾回收机制
我们知道Java内存运行时数据区域划分为5个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生,随着线程而灭;栈中每一个栈帧中分配的内存在编译期就已经确定下来,因此这几个区域的内存分配与回收都具备确定性。而Java堆和方法区,这部分的内存分配与回收是动态的,是垃圾收集器所需要回收的关注回收的区域。在回收对象之前,首先要确定对象能否被回收。当一个对象不在被其它途径使用时,这个对象就可以被回收了。一、垃圾标记算法在堆里面存放着Java中几乎所有的对象实例,垃圾回收器在对堆进行回收前,首先需要原创 2020-08-31 23:22:01 · 243 阅读 · 0 评论 -
深入理解JVM:运行时数据区域划分
一、运行时数据区Java虚拟机在Java执行的过程中会将它所管理的内存区域划分为若干个不同的数据区域。Java7.0划分如下其中:线程共享:方法区、堆线程私有:虚拟机栈、本地方法区、程序计数器注:在Java8中移除了永久代(方法区),通过元数据区(meataspace)存储数据。元数据区本质与永久代类似,都是对方法区的实现。区别:元数据空间不在虚拟机中,而是使用本地内存1.1、程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是记录当前原创 2020-08-31 22:08:02 · 560 阅读 · 0 评论