JVM
wb_snail
这个作者很懒,什么都没留下…
展开
-
class.forName()方法有什么作用
JVM规定了几种必须对类执行初始化的场景,class.forName就是其中一种,它会让jvm对指定的类执行加载、连接、初始化操作,其结果是: 1.jvm会查找指定路径类的class文件,然后将class文件读入内存,为该类生成一个class对象作为访问类型信息的入口(类型信息是该类的class文件转换成的数据结构,存储在方法区,class对象就是用于访问这个数据结构的,我们可以通...原创 2018-06-20 09:22:49 · 9942 阅读 · 2 评论 -
volatile的作用
java内存模型:是为了定义程序中多个线程间可共享变量(以下简称变量)的读写规则java内存模型规定了所有变量都存储在主内存中,每条线程都有自己的工作内存,工作内存中保存了被其使用到的所有变量的主内存拷贝副本,所有操作都是对该副本直接进行,而不能直接读写主内存中的变量。当变量被某个线程修改后,虚拟机会将修改后的值同步回主内存。线程之间各自独立,对于同一份变量的copy是不能共享的。从定义上看,...原创 2018-06-18 22:58:28 · 527 阅读 · 0 评论 -
java与C/C++的比较
java是动态安全的语言,会在运行时进行很多与安全相关的检查,比如空指针,数组越界,类型转换异常等,这在java中都无需程序员去编写防御代码,而在C/C++程序中出现类似的问题, 一不小心就会出现Segment Fault信号或者Window编程中常见的“xxx内存不能为Read/Write”之类的提示, 处理不好程序就直接崩溃退出了。 但这些安全检查也导致了相同的程序, Java要比C/C++做...原创 2018-06-17 13:04:27 · 3323 阅读 · 0 评论 -
java对象只在堆中分配吗?对象逃逸分析
逃逸分析:逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义后,可能会被外部方法所引用,比如方法调用,也有可能被其他线程访问,比如类变量,这两种情况分别叫做对象的方法逃逸和线程逃逸如果虚拟机通过分析得出对象不会存在方法逃逸或者线程逃逸,则可以进而采取下面几种优化措施:同步消除:同步操作是一个耗时的过程,如果确定一个变量不会发生线程逃逸,也就是不会被其他线程访问到,那对于这个变量的同...原创 2018-06-17 10:43:27 · 1128 阅读 · 0 评论 -
java中有哪些语法糖,泛型的原理
java中的语法糖:泛型、自动装箱拆箱、变长参数、增强for循环、switch字符类型等,这些都是语法糖虚拟机运行时不支持这种语法,在编译期间这些内容会被还原为基础的语法结构,这个过程称为解语法糖我们拿泛型来说明:它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java语言来说,ArrayList<i...原创 2018-06-09 10:18:34 · 1019 阅读 · 0 评论 -
jvm栈帧包含哪些内容
栈帧:前面说了,当线程执行到某个方法时就会往方线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址、动态连接等信息局部变量表:顾名思义就是用来存储java方法中的局部变量的,在编译期间就会分配方法局部变量表的最大容量,局部变量表以变量槽为单位,每个变量槽可以存储32位及32位以下的变量,具体大小根据变量实际占用内存而定,java的基本类型中除了long和double外其他...原创 2018-06-07 15:59:46 · 4988 阅读 · 0 评论 -
双亲委派模型打破后还安全吗
类加载器:在类加载的第一步'加载'过程中,首先就是通过类的全限定名去获取类的二进制字节流,这个步骤就是由类加载器来完成的,每个类加载器在虚拟机中都有其唯一的类名称空间,不同的类加载器位于不同的名称空间中,在虚拟机中,如果想唯一确定一个类,除了类的全限定名外还需要加载该类的加载器。所以即使是同一个类,被不同的加载器加载,也必然不相等java中一共有三种类加载器,分别是:启动类加载器bootStrap...原创 2018-06-07 14:15:33 · 707 阅读 · 0 评论 -
JVM类加载过程详解
jvm将class文件加载到内存,并对其进行校验,转换和初始化,最终形成jvm可以直接操作的内容,这就是虚拟机的加载机制类的生命周期:类从加载到内存,再到使用,再到被卸载,整个生命周期经历的步骤如下图:类加载步骤:'使用'之前的步骤称为类加载,类加载分为 加载、连接、初始化,而连接阶段又被分为了验证、准备、解析三个阶段,注意:除了'解析'这一步外,其他步骤都是严格按照图上标示的先后顺序来启动的,虚...原创 2018-06-07 13:33:47 · 972 阅读 · 0 评论 -
JVM垃圾回收算法、垃圾收集器种类、常用垃圾收集器参数
对象是否可回收判断方式:1.引用计数法:对象每被引用一次,其引用计数就+1,不再引用时就-1,这样虽然简单高效,但是无法解决互相引用的问题,比如A持有B,B持有A A a=new A(); B b =new B(); a.instance=b; b.instance=a; a=null;b=null; 这样引用计数都不为0,也就无法回收2.可达性分析:确定一批GC Roots引用,然后以这些引...原创 2018-06-06 16:40:46 · 874 阅读 · 0 评论 -
java对象包含哪些内容,对象大小怎么算
java对象的内存布局:对象头:包含两部分数据,一部分是运行时数据,包含了对象的hash值,GC分代年龄,锁状态,线程持有的锁,偏向锁等信息一部分是对象的类型指针,虚拟机通过这个指针确定对象是那个类的实例,如果是数组,还必须包括数据的长度信息实例数据:接下来就是对象的成员变量的内容,包括了从父类继承下来的内容对齐补白:jvm要求java对象的起始地址必须是8的倍数,所以这部分内容用来对齐...原创 2018-06-06 16:38:15 · 4860 阅读 · 1 评论 -
java对象是怎么创建出来的
java对象的创建过程:类加载(后面介绍)对象内存分配:对象内存分配就是在堆中划分一块区域给该对象,分配的方式有指针碰撞和空闲列表,指针碰撞的方式就是采用连续的空间进行对象内存分配,左边都是已分配内存,右边都是空闲内存,中间是一个指针,空闲列表就不是连续的内存了,需要维护一个映射表存储了哪些区域已用哪些区域空闲。采用何种方式取决于使用的垃圾收集器,目前CMS收集器采用的时空闲列表,其他如Seria...原创 2018-06-06 16:36:14 · 4167 阅读 · 0 评论 -
java方法区和常量池
方法区: 和java堆一样,方法区也是属于线程共享的区域,存放的是java的类型信息,静态变量,运行时常量池以及jit编译后的代码等数据。 运行时常量池: class文件中除了包含类的版本,类名,字段,方法,接口等信息,还包含了常量池,这里面存放了编译期产生的各种 字面量以及符号引用,在类加载后进入方法区的运行时常量池中,运行时常量池相对于class常...原创 2018-07-04 17:55:11 · 2408 阅读 · 0 评论