- 博客(15)
- 资源 (1)
- 收藏
- 关注
原创 java解剖学:对象内存布局
零、快速入门1. 每个java对象在内存中映射一个C++对象,C++对象只存储java对象头信息(mark和klass),C++头对象之后紧跟着java成员变量2. java对象内存布局,主要是针对C++头对象之后的内存区域做编排3. 常见的内存布局方式,是按照成员变量定义顺序依次分配内存地址(例如C++),但因为存在内存对齐机制,顺序分配会引入不少空白区域4. hotspot虚拟机不使用变量声明顺序确定内存地址顺序,而是将相同类型的变量连续分布,同时长类型(double/long)在前,短
2020-10-26 15:52:47 247 1
原创 JVM局部变量表
局部变量表是JVM线程栈中每个frame中一个组成单元(具体细节见《JVM线程栈》),存放线程在当前方法执行过程中依然有效的局部变量。局部变量表的长度在类编译过程中就能确定,这样有利于frame初始化。 void fun () { int a = 0; int b = 1; int c = 2; } fun的局部...
2018-10-19 11:16:40 879
原创 JVM线程栈
JVM栈中存放了一组frame(栈帧),以LIFO的方式存储,方法调用时生成一个frame,方法执行结束时删除一个frame。frame中存放方法调用时调用者的执行状态快照,在被调方法执行结束后,用于恢复方法调用前的程序执行状态。栈帧的概念在c或c++语言编译出来的汇编语言中也存在,用ESP和EBP定义栈顶和栈底。汇编和JVM的栈帧功能都一样,只是汇编的frame直接给cpu看,而JVM里的fra...
2018-10-19 10:48:48 1329
原创 JVM常量池
java语义中的常量池有三个概念:1. 一个是class文件中的常量池,这里存放着类、字段和方法的名称,静态成员变量的值,字符串常量等一系列类相关的信息:Constant pool:#1 = Class #2 // com/learn/clazz/file/SampleClass#2 = Utf8 com/learn/clazz/file/SampleClass#3 = Cl...
2018-10-19 10:20:55 437
原创 spring依赖注入
一、 注入方式spring依赖注入有三种典型的方式,一种通过xml中property标签注入,一种通过注解注入,一种是自动注入(默认关闭)1. xml<bean class="com.learn.spring.xml.SingletonBean"> <property name="property" value="test2" /></bean>...
2019-04-25 20:04:07 620
原创 FastClass和Reflex性能比较
Cglib中提供FastClass增强功能,FastClass顾名思义是一个能让被增强类更快调用的Class,主要针对调用方法是变量的场景,用于替代反射调用。FastClass的实现逻辑,是生成增强类实现invoke方法,invoke方法中,用switch语义将被增强类的所有方法调用枚举出来。用户使用FastClass.invoke方法,传入方法签名和被调用实例,从而达到不使用反射就能实现不确...
2019-03-18 16:06:54 4100 6
原创 class文件内容解析
class文件基本数据结构:使用javac编译后的文件是.class文件,程序运行时,class文件被classLoader加载到JVM成为class对象,随后便可以创建该类的对象。class文件是二进制文件流,记录类相关信息,可以被JVM解析。class文件内容并不复杂,结构如下:ClassFile { u4 magic; u2 ...
2018-11-01 16:17:05 1005
原创 JVM运行时内存区域
1. JVM数据区域JVM数据区域分两类,一类生命周期随vm,一类生命周期随thread。 2. pc寄存器(线程独占)JVM在设计上支持多个线程同时执行(硬件上适配多核cpu是真正意义上的并行),为此每个线程都有属于自己的pc register,注意这里的指令寄存器并不是8086这样cpu架构里的pc register,JVM里的pc register只是抽象的概念,并不对应具体...
2018-10-19 10:25:33 176
原创 spring注解小结
spring提供了一系列注解,有很多作用,此处做归纳和总结。1. @Configuration作用在类上,声明一个class需要被spring解析以扩充beanDefinition。@Configration注解同时被@Component注解修饰,因此具有被自动加载的特点,被@Configuration修饰的类本身也会作为definition注册。value属性是Configurati...
2018-09-10 14:08:00 1030
原创 java项目启动研究
一直以来都是通过tomcat启动java应用,从未考虑过应用具体启动流程。本例分析从main函数启动的方式,加深对java底层执行的理解。一、 使用java命令启动xxx.java1. 首先用javac编译文件2. 使用 java MainClass.class 执行文件,我首次尝试的时候总是抛出异常:错误: 找不到或无法加载主类 MainClassMainClass.java 内容如下:pack...
2018-06-29 12:08:56 1099 3
原创 java泛型小结
一、概述泛型是java1.5引入的概念,用于规范用户输入类型,泛型使用的一个误区是将泛型当做类型或变量看待,从而尝试例如 T.class,new T() 等操作,实际上泛型只是一个契约,约定了在本类里用到相同泛型的地方类型一致,使用时,跨类之间契约可传递。泛型的好处:1. 实现java类型安全,相当于用户提供泛型信息,编译器帮用户做类型校验,减少用户错误编码造成的类型异常。2. 使...
2018-06-20 19:40:06 224
原创 java try...catch...finally机制详解
一、 问几个问题在说明try...catch...finally机制前,先出几道题目作为文章的引子。有这样一种结构try { A; // A代表被try包裹的代码块} catch (FileNotFoundException e) { B;} finally { C;}1. 什么是try...ca
2016-06-23 21:59:37 412
原创 log4j是什么,log4j解决了什么问题,log4j怎么用
Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。1. 为什么要用日志管理类,好像没有这些日志管理类,代码也可以正常跑起来。答:日志管理类确实不影响代码正常执行,但是当代码复杂程度越来越高,我们需要日志管理类来帮我们记录代码运行状态,用以帮助我们理解代码的执行情况。此时使用封装好了的成熟的日志管理类,就能在实现我们需求的同时简化我们的操作。
2015-09-17 19:58:06 2591
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人