[JVM] - 不就是JVM么 JVM的继续探究
前面几章跟着作者的脚步实现了使用Go语言查看java的.class文件源码(16进制)
复习一下:
相比Java语言,Go的访问控制非常简单,只有公开和私有两种. 所有首字母大写的类型,
结构体,字段,变量,函数,方法等都是公开的. 可供其它包使用. 首字母小写则是私有的.
只能在包内部使用.
接下来使用大神作者的classpy查看某个class文件,当然也能打开.jar
这是被称呼为魔数的代码.
很多文件格式都会规定满足该格式的文件必须以某几个固定字节开头,这几个字节主要起到标识作用, 叫做魔数( magic number )
class文件的魔术是"0xCAFEBABE"
除了Object.class, 看到OutOfMemoryError.class同样也有这个魔数
classfile/class_file.go :
func (self *ClassFile) readAndCheckMagic(reader *ClassReader) {
magic := reader.readUint32()
if magic != 0xCAFEBABE {
panic("java.lang.ClassFormatError: magic!")
}
}
通过if 判断是否为 0xCAFEBABE 继而做出响应,JAVA虚拟机规范规定,如果加载class文件不符合要求的格式,Java虚拟机实现就抛出java.lang.ClassFormatError异常
再一个是版本号.
为了还要节省时间看缓存知识,这里大概略过一下
这个是类访问标志, 作者说由于常量池比较复杂放到3.3节介绍了
常量池之后就是这个类访问标志,这是一个16位的"bitmask(位掩码)" , 指出class文件定义的是类还是接口,访问级别是public还是private,等等.
类和超类索引, 类访问标志之后是两个u2类型的常量池索引,分别给出类名和超类名.
class文件存储的类名类似完全限定名, 但是把点换成了斜线, Java语言规范把这种名叫 二进制名 (binary names)
因为每个类都有名字,所以thisClass必须是有效的常量池索引.
除java.lang.Object之外,
其他类都有超类, 所以superClass只在Object.class中是0 , 在其它class文件中必须是有效的常量池索引.
<非Object.class
那么!
接口索引表 ,类和超类索引后面是接口索引表,表中存放的也是常量池索引.
给出该类实现的所有接口的名字.
拿Object.class的来看,剩下的还有这些
字段啊,方法啊,参数啊.等等吧! 忽然想起来一句话,不管之前的过往和经历如何,都是为了你能更好地成长! 所以要把失败当动力,把压力当动力!
和类一样,字段和方法也有自己的访问标志. 访问标志之后是一个常量池索引,给出字段名或方法名.
然后又是一个常量池索引,给出字段或方法的描述符,最后是属性表.
等等.
3.3节 解析常量池 (为了加快看SpringBoot底层知识,我也是加快了打字速度)
常量池呢 它占据了class文件很大一部分数据, 里面存放着各式各样的常量信息, 包括:
数字, 字符串常量池, 类, 接口名, 字段, 方法名, 等等.
JVM还要深入,但现在要看SpringBoot的深入知识点了
PS D:\go\workspace\bin> ch03 -Xjre "F:\jre7" java.lang.String
java.lang.String
version: 51.0
constants count:
access flags: 0x31
this class: java/lang/String
super class: java/lang/Object
interfaces: [java/io/Serializable java/lang/Comparable java/lang/CharSequence]
fields count:
value
hash
serialVersionUID
serialPersistentFields
CASE_INSENSITIVE_ORDER
HASHING_SEED
hash32
methods count:
<init>
<init>
<init>
<init>
<init>
<init>
<init>
checkBounds
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
length
isEmpty
charAt
codePointAt
codePointBefore
codePointCount
offsetByCodePoints
getChars
getChars
getBytes
getBytes
getBytes
getBytes
equals
contentEquals
contentEquals
equalsIgnoreCase
compareTo
compareToIgnoreCase
regionMatches
regionMatches
startsWith
startsWith
endsWith
hashCode
indexOf
indexOf
indexOfSupplementary
lastIndexOf
lastIndexOf
lastIndexOfSupplementary
indexOf
indexOf
indexOf
lastIndexOf
lastIndexOf
lastIndexOf
substring
substring
subSequence
concat
replace
matches
contains
replaceFirst
replaceAll
replace
split
split
toLowerCase
toLowerCase
toUpperCase
toUpperCase
trim
toString
toCharArray
format
format
valueOf
valueOf
valueOf
copyValueOf
copyValueOf
valueOf
valueOf
valueOf
valueOf
valueOf
valueOf
intern
hash32
compareTo
<clinit>
[JVM] - 不就是JVM么 JVM的继续探究的更多相关文章
- JVM参数(一)JVM类型以及编译器模式
现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不 ...
- JVM基础:深入学习JVM堆与JVM栈
转自:http://developer.51cto.com/art/201009/227812.htm JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题, ...
- 概览JVM的基本结构和JVM内存结构
概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...
- JVM(8):JVM知识点总览-高级Java工程师面试必备
http://www.importnew.com/23792.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 当然这些知识点 ...
- JVM的基本结构和JVM的内存结构
这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...
- JVM(七),JVM面试小知识
七.JVM面试小知识 1.JVM三大性能调优参数 -Xms -Xmx -Xss 的含义 2.java内存模型中堆和栈的区别 3.不同JDK版本中的intern()方法的区别
- jvm学习(2)JVM内存说明
前言 一.类方法 类方法是静态方法,前面需要有static修饰符修饰.类方法内不能涉及有关变量的内容1.不能调用类的对象方法2.不能引用对象变量3.类方法不能被重写(覆盖)4.类方法不能使用super ...
- JVM探秘:jinfo查看JVM运行时参数
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 如何查看JVM运行时参数,对于线上JVM调优是很关键的,因为只有知道了当前使用的JVM ...
- JVM性能优化 (一) 初识JVM
一.我们为什么要对JVM做优化 在本地开发环境中我们很少会遇到需要对JVM进行优化的需求,但是到了生产环境,我们可能会有下面的需求: 运行的应用"卡住了",日志不输出,程序没有反应 ...
- JVM源码分析之JVM启动流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...
随机推荐
- 【JMeter】如何录制创建及得到曲线图
前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...
- 【虫师】【selenium】参数化
# 1 #coding=utf-8 from selenium import webdriver import os,time source = open("F:\\test\\info.t ...
- Tomcat项目部署的三种方法
第一种方法如下:直接把我们的项目文件夹放到tomcat里面,在这里我自己做的是一个测试项目oa,如图 启动tomcat,打开浏览器,输入localhost/oa 即可打开你的文件,注意 :访问的时候 ...
- python排序函数sort()与sorted()区别
sort是容器的函数:sort(cmp=None, key=None, reverse=False) sorted是python的内建函数:sorted(iterable, cmp=None, key ...
- [LeetCode] 88. Merge Sorted Array_Easy tag: Two Pointers
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...
- jquery更改表格行顺序实例
使用jquery写的更改表格行顺序的小功能 表格部分: 复制代码代码如下: <table class="table" id="test_table"> ...
- 引入jQuery的src设置
1.引用在线jQuery 谷歌.微软.百度都有提供在线的jQuery引用.比如 <script src="http://code.jquery.com/jquery-latest.js ...
- SQL语句--查询任务
SELECT 目标字段1, 目标字段2 FROM 目标表WHERE ID IN(SELECT 外键 FROM 外键所在表WHERE 提供数据字段 IN(提供数据第一条, 提供数据第二条, ))
- Impala shell详解
不多说,直接上干货! 查看帮助文档 impala-shell -h 刷新整个云数据 impala-shell -ruse impala;show tables; 去格式化,查询大数据量时可以提高性能 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...