jvm概念梳理


一,虚拟机了解

1,主流虚拟机

         sun公司:HotSpot          BEA公司:JRockit       IBM公司: J9VM

二, jvm 内存分布模型

   


1,程序计数器

虚拟栈,本地方法栈这几个区域的内存分配和回收都具备确定性,而堆和方法区不能,因为一个接口中的多个实例类需要 的内存可能不一样,一个方法中多个分支(if)需要的内存可能不一样。


2,在Hotspot中对象的类型信息里有记录自己的oop map  记录了该类型的对象内什么偏移量是什么类型的数据


3,java虚拟机采用解释执行和编译执行共存架构,当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译时间,立即执行,在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,可以获取更高的执行效率。


三, 垃圾回收

  新生代GC (Minor GC)  


        老年代GC(Major GC  /  Full GC )  *老年代GC 经常会伴随至少一次Minor GC(不过在parallel ,scavenge收集器中的策略只进行Major GC)


        1,内存分配比例

             老年代:新生代 = 2:1

             新生代中  默认分配比例: 8:1:1


四,类对象加载过程


1, java程序中如果定义了超过64KB英文字符的变量或方法名,将无法编译。


2,类加载过程

(1) 加载class文件

(2)验证: 包括 文件格式、元数据、字节码、符号引用 验证

(3)准备: 正式为类变量分配内存并设置类变量初始阶段

(4)解析: 包括 类接口、字段、类方法、接口方法,将虚拟机常量池内的符号引用值替换为直接引用过程

(5)初始化

(6)使用

(7)卸载


3,类加载器:使用双亲委派模型

4,对象创建过程

      首先会检验类是否已经加载,如果未加载会先加载类  (注:对象所需内存大小在类加载之后就完全确定了)

  (1)  虚拟机为新生对象分配内存

(2)将分配的内存空间都初始化为零值

(3)虚拟机对对象进行必要设置(对象头信息)

(4)对象初始化


5,概念:

(1) 宗量: 方法的接收者和方法的参数统称为方法的宗量

(2)方法签名:由方法名称和一个参数列表组成

(3)静态分派: 所有依赖静态类型来定位方法执行版本的分派动作

(4)动态分派: 在运行期间根据实际类型确定执行版本的分派动作

  

Human man=new Man();

其中 Human是静态类型,也成为外观类型,    Man是实际类型


:静态分派在编译器需要确定静态类型和方法参数 属于多分派,动态分派只需要确定实际类型属于单分派



五,常量池

1,字符串常量池(全局唯一):也保证了相同的字符常量只存在一份

2,class文件常量池(每个class文件都有)

3, 运行时常量池 (每个class文件都有)


   class文件常量池中的字面量和符号引用在类加载后进入方法去的运行时常量池中存放。


   过程: class 文件  →加载→  字面量和符号引用转存到运行时常量池  →验证、准备→在堆中生成驻留字符串实例对象,并将对象引用存到字符常量池

      →解析→ 把运行时常量池中的字符引用替换为直接引用    

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值