
JVM
ouyang2018
这个作者很懒,什么都没留下…
展开
-
类加载
类加载在java代码中,类型的加载,连接与初始化的过程都是在程序运行期间完成的,类型可以理解为class。类的加载、连接、初始化、使用、卸载加载:查找并加载类的二进制数据,就是将类的class文件加载到内存中;将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象用来封装类在方法区内的数据结构连接:就是将已经读入到内存中的二进制数据合并到虚拟机的运行时环境中...原创 2019-09-29 17:25:37 · 77 阅读 · 0 评论 -
线程上下文类加载器
当前类加载器(current ClassLoader)每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(加载的是依赖的类)如果ClassX引用了ClassY,那么ClassX的类加载器就会去加载器ClassY(前提是ClassY尚未被加载)线程上下文类加载器(ContextClassLoader):从JDK1.2开始引入,类Thread中getContextClassLo...原创 2019-09-30 09:04:42 · 107 阅读 · 0 评论 -
JVM内存模型
虚拟机栈:程序计数器(Program Counter):本地方法栈:主要用于执行本地方法堆(Heap):JVM管理的最大的一块内存空间方法区:存储元数据。在HotSpot虚拟机中也叫永久代,从jdk1.8开始,已经彻底废弃了永久代,使用元空间代替运行时常量池:方法区的一部分内容直接内存虚拟机栈:主要由栈帧(每个方法会生成一个栈帧)构成,栈帧由局部变量表,操作数栈,动态链接,方法出口...原创 2019-09-30 09:16:05 · 78 阅读 · 0 评论 -
java线程内存模型
cpu缓存模型上图中的cpu缓存实际上应该数据cpu中,为了方便展示而画在外面,cpu的运算速度大大的快于主内存,所以为了屏蔽掉这种差异,会使用cpu高速缓存,使cpu在获取数据时先从高速缓存中获取。java内存模型java线程内存模型跟cpu缓存模型类似,是基于cpu缓存模型来建立的,java线程内存模型是标准化的,屏蔽掉了底层不同计算机的区别java内存模型数据原子操作read...原创 2019-09-30 09:22:49 · 124 阅读 · 0 评论 -
字节码文件
使用Javap -verbose 命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法、类变量与成员变量信息。Classfile /E:/work/soft/eclipse/workspace/cmzy-jvm/bin/bytecode/MyTest1.class Last modified 2019-7-9; size 467 byte...原创 2019-10-02 13:15:19 · 171 阅读 · 0 评论 -
栈帧(stack frame)
栈帧用于帮助虚拟机执行方法调用与方法执行的数据结构。封装了方法的局部变量表、动态链接信息、方法的返回地址以及操作数栈等信息符号引用、直接引用局部变量表中存放的基本单位是slot,对于32位及以下的数据一般是占用一个slot,而对于64位的一般是占用两个slot,如long何double;slot是可以复用的,局部变量是有作用域的。符号引用:有些符号引用会在类加载或在第一次使用的时候就转换成直...原创 2019-10-02 15:49:13 · 716 阅读 · 0 评论 -
JVM配置参数
-verboose:gc-XX:PrintGC可以打印GC的简要信息-XX:+PrintGCDetails 打印GC详细信息-XX:+PrintGGCTimeStamps 打印GC发生的时间戳-Xloggc:log/gc.log指定GClog的位置,以文件输出,log/gc.log表示文件所在位置,必须是存在的目录和文件,否则无法找到-XX:+PrintHeapAtGC...原创 2019-10-02 15:50:01 · 281 阅读 · 0 评论 -
JVM助记符
JVM助记符:ldc:表示将int,float或者String类型的常量值从常量池中推送至栈顶bipush:表示将单字节byte(-128 – 127)的常量值推送至栈顶;sipush :表示将一个短整型short(-32768 – 32767) 的常量值推送至栈顶;iconst_1 :表示将int类型的1推送至栈顶(iconst_m1 – iconst_5),iconst_m1表示 -...原创 2019-10-02 15:50:32 · 329 阅读 · 0 评论 -
栈上分配
一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以及TLAB(其实也是在堆上)栈上分配:针对那些作用域不会逃逸出方法的对象,在分配内存时不在将对象分配在堆内存中,而是将对象属性打散后分配在栈(线程私有的,属于栈内存)上,这样,随着方法的调用结束,栈空间的回收就会随...原创 2019-10-02 15:54:07 · 3479 阅读 · 0 评论