2018-04-27 初识jvm

2018-04-27  本文已影响0人  江江江123

jvm 数据区及其作用:

程序计数器:我们代码中if else ,switch,for 等逻辑语句通过计数器实现
方法区:存放项目中的静态常量,数据类型,html,jsp等
本地方法栈:存放被native修饰的方法,这些方法的具体实现时基于本地计算机而不是jvm的
虚拟机栈:存放各种对象的地址
堆:对象的实际存放位置,所占空间最大

堆栈:堆时对象的实际存储区域,但是为了存取方便,我们一般只对地址做操作,而这些地址就被存在栈中

对象的创建过程:

1先判断类是否已被加载,否:分配内存(判断内存是否规整)(考虑线程安全)
2初始化内存空间(清空,so,objcect==null的存在很有必要)
3设置对象头:包括对象元数据信息,哈希码,GC分代年龄。。。
4进行对象初始化 (对象的构造方法),对象入栈(对象构造在前,入栈在后)

内存规整:内存中已使用和未使用的区域是分开的

不规整:一部分已使用,一部分未使用,又一部分使用。。(多出现在各种集合上)

jvm中对象包含信息:

1对象头:哈希码,gc分代年龄,锁状态标示,线程持有锁,偏向线程id,偏向时间戳;
类型指针,数组长度(只在java数组中有)
2实例数据:正常的类构造加载
3对齐填充:8位倍数的占位符

栈到堆的访问方法

实现方法多种,常见:
1句柄池:在堆中开辟内存,存放对象及其类型的指针。栈中存放引用类型,引用类型指向句柄池(优势 稳定,当GC移动对象时栈中的引用不会发生改变,只会改变句柄池的引用)
2直接指针访问:栈中引用类型直接指向堆中的对象,对象包含类型指针(优势:速度快)

Class涵盖信息:(解析16进制数据真叫人头大)

1.magic u4 确定class文件能否被jvm接收
为什么被叫java?所有能被jvm接受的class文件开头都是cafebabe这8位4字节
2.minor_version u2 次版本
3.major_version u2 主版本(jdk版本)
4.constant_pool_count u2 常量数(存放字面量和符号引用)
字面量:java中的文本字符串,final声明的常量等
符号引用:
类,接口的全名
字段的名称及描述
方法名称及描述
5.constant_pool
6.access_flags:u2
判断类是否为public
是否声明为Final(为类时)
是否是接口
是否是抽象类
是否由用户代码产生
是否是注解
是否是枚举
7.this_class:u2
索引,全限定名
8.super_class:u2
索引,父类的全限定名,only one,除了long.object其它所有类都有该值
9.interfaces_count:u2
计数器,统计实现了几个接口
10.interfaces:u2
索引,集合(如果本身是接口则是继承)
11.fields_count
字段数
12.fields
包含类内的变量,实例化量(static修饰),不包含方法中的变量;
所含参数:作用域,是否被static修饰,能否被修改(final),是否支持并发(volatile),能否序列化(transient),字段数据类型,字段名
13.methods_count
方法数
14.methods
所含参数:作用域,是否被static修饰,能否被修改(final),是否支持并发(synchronized),是否由编译器产生,是否接受不定参数,是否为native,是否为抽象方法,是否为桥接方法,是否为strictfp(精准浮点)
15.attributes_count
属性数
16.attributes
16.1 Code
包含属性:
attribute_name_index 索引,执行属性名称
attribute_length 属性值长度
max_locaks 局部变量所需存储空间 单位Slot(32位)
code_length 编译后的字节码长度,不超过65535,编译复杂jsp可能会失败
code 编译后的字节码流
16.2Exceptions
attribute_name_index 索引,执行属性名称
attribute_length 属性值长度
number_of_exceptions 受查异常种数
exception_index_table 索引,受查异常类型
16.3LineNumberTable
如果不生成该属性,当程序异常时不会抛出行数;
无法进行断点调试
所含属性:
attribute_name_index 索引,执行属性名称
attribute_length 属性值长度
line_number_table_length line_number_table的长度
line_number_table 包含字节码行数start_pc和java源码行数line_number
16.4LocalVariableTable属性
如果没有改参数,则引用方法时,会丢失参数名称
attribute_name_index 索引,执行属性名称
attribute_length 属性值长度
local_variable_table_length local_variable_table长度
local_variable_table
。。
属性有很多,但是不一定都要用。。

上一篇 下一篇

猜你喜欢

热点阅读