自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 jvm——方法区元空间的相关监测工具及其使用

示例代码package com.memory;/** * @author dc * @date 2020/6/28 - 17:57 */public class MyTest5 { public static void main(String[] args) { while (true) { System.out.println("Hello, World!"); } }}1、jmap -clstats pid(

2020-06-28 18:24:02 754

原创 jvm——方法区产生内存溢出错误

1、示例代码package com.memory;/** * @author dc * @date 2020/6/28 - 15:29 */import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.Proxy;/** * 方法区产生内存溢出错误 */public class MyTest4 { public stat

2020-06-28 18:10:30 201

原创 jvm——模拟两个线程之间的死锁

1、示例代码package com.memory;/** * @author dc * @date 2020/6/28 - 14:46 */public class MyTest3 { /** * 该主线程(main方法)的执行流程: * 首先创建了两个线程,名字分别为 "Thread-A"、"Thread-B" * 这两个线程分别执行,当执行A线程的时候,A线程中的方法并没有马上执行完,而是睡眠了5秒,再去访问 * B线程中的资源,而此时,B

2020-06-28 15:28:21 129

原创 jvm——虚拟机栈内存溢出

1、示例代码package com.memory;/** * @author dc * @date 2020/6/28 - 9:58 *//** * 虚拟机栈溢出 */public class MyTest2 { private int length; public int getLength() { return length; } public void test() { this.length ++;

2020-06-28 11:19:04 148

原创 jvm——堆内存溢出

示例代码package com.memory;import java.util.ArrayList;import java.util.List;/** * @author dc * @date 2020/6/27 - 14:32 *//** * 虚拟机栈:Stack Frame 栈帧 * 程序计数器(Program Counter) * 本地方法栈:主要处理由 c++ 实现的方法 * 堆(Heap):jvm管理的最大的一块内存空间,与堆相关的一个重要概念是垃圾收集器。现在几乎所

2020-06-28 11:13:21 98

原创 jvm——基于栈的指令集与基于寄存器的指令集之间的关系

现代jvm在执行java代码的时候,通常都会将解释执行与编译执行两者结合起来进行。所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令。所谓编译执行,就是通过及时编译器(just in time,JIT)将字节码转换为本地机器码来执行;现代jvm会根据代码热点来生成相应的本地机器码。基于栈的指令集与基于寄存器的指令集之间的关系:1、jvm执行指令时所采取的方式是基于栈的指令集。2、基于栈的指令集的主要操作有入栈与出栈两种。3、基于栈的指令集的优势在于它可以在不同的平台之间移植

2020-06-27 10:13:29 412

原创 jvm——方法的静态分派(方法重载)与动态分派(方法重写)

1、方法的静态分派package com.bytecode;/** * @author dc * @date 2020/6/26 - 15:30 *//** * 方法的静态分派: * * Grandpa g1 = new Father(); * * 以上代码,g1的静态类型是Grandpa,而g1的实际类型(真正指向的类型)是Father。 * * 我们可以得出这样一个结论:变量的静态类型是不会发生变化的,而变量的实际类型则是可以发生 * 变化的(多态的一种体现),实际类型是

2020-06-26 16:23:15 170

原创 jvm——字节码中的方法的执行分析

1、代码package com.bytecode;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;/** * @author dc * @date 2020/6/24 - 16:22 */public class MyTest3 {

2020-06-26 10:42:58 76

原创 jvm——字节码结构分析

1、产看字节码文件的命令1、javap com.bytecode.MyTest12、javap -c com.bytecode.MyTest13、javap -verbose com.bytecode.MyTest12、字节码结构1、使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息。2、魔数:所有的.class字节码文件的前四个字节都是魔数,魔数值为固定值:0xCAFEBABE。

2020-06-24 11:26:46 77

原创 jvm——线程上下文类加载器的使用模式

线程上下文类加载器的一般使用模式(获取——使用——还原):ClassLoader classLoader = Thread.currentThread().getContextClassLoader();try{Thread.currentThread().setContextClassLoader(targetClassLoader);myMethod();}finally{Thread.currentThread().setContextClassLoader(classLoader);}

2020-06-18 17:00:14 109

原创 jvm——线程上下文类加载器

/** * @author dc * @date 2020/6/17 - 13:05 *//** * 当前类加载器(Current ClassLoader): * 每个类都会使用自己的类加载器(即加载自身的类加载器)去加载其他类(指的所依赖的类), * 如果classX引用classY,那么classX类加载器就会加载classY(前提是classY尚未被加载) * * 线程上下文类加载器(Context ClassLoader): * 线程上下文类加载器从JDK1.2开始引入的,类T

2020-06-17 13:31:19 89

原创 jvm——扩展类加载器与系统类加载器是如何加载的

内建于jvm中的启动类加载器会加载java.lang.classloader以及其他的java类平台,当jvm启动时,一块特殊的机器码会运行,它会加载扩展类加载器与系统类加载器,这块特使的机器码叫作启动类加载器(Bootstrap)。启动类加载器并不是Java类,而其他的列加载器则是java类,启动类加载器特定于平台的机器指令,它负责开启整个加载过程。所有的类加载器(除了启动类加载器)都是java类,不过,总归要有一个组件来加载第一个java类加载器,从而让整个加载过程能够顺利进行下去,加载第一

2020-06-16 14:24:57 281

原创 jvm——类加载器的双亲委托模型的好处

1、可以确保java核心库的安全:所有的Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.labg.Object这个类会被加载到java虚拟机中,如果这个加载过程是由java应用自己的类加载器所完成的,那么很可能就会在java虚拟机中存在多个版本的java.lang.Object类,而且这些类之间是不兼容的,互相不可见的(存在于不同的命名空间中)。借助于双亲委托机制,java核心类库中的类的加载工作都是由根类加载器来统一完成加载工作,从而确保了java应用所使用的都

2020-06-14 19:16:17 137

原创 jvm——类加载器的命名空间2

1、实例代码import java.lang.reflect.Method;/** * @author dc * @date 2020/6/14 - 18:01 *///在jvm中可以存在多个命名空间,每个命名空间是相互隔离开的,// 任意两个命名空间中的信息彼此不可见,也就是不能彼此访问。public class MyTest13 { public static void main(String[] args) throws Exception { //创

2020-06-14 18:34:01 69

原创 jvm——类加载器的命名空间1

命名空间:每个类加载器都有自己的命名空间,命名空间由该类加载器及其父类加载器所加载的类组成。在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。在不同的命名空间中,有可能出现类的完整名字(包括类的包名)相同的两个类。关于命名空间的重要说明:1、子加载器加载的类能够访问父加载器所加载的类2、父加载器加载的类不能访问子加载器所加载的类实例代码/** * @author dc * @date 2020/6/13 - 10:51 */public class Sample

2020-06-14 10:33:09 98

原创 jvm——自定义类加载器

1、实例代码import java.io.*;/** * @author dc * @date 2020/6/7 - 10:29 */public class MyTest9 extends ClassLoader { //定义类加载器的名字 private String classLoaderName; //类加载器加载字节码文件(class)的路径 private String path; //定义文件名字后缀 private fina

2020-06-13 10:14:30 90

原创 jvm——加载类与类的反射的区别

1、示例代码/** * @author dc * @date 2020/6/6 - 16:45 *///使用loader对象加载类并不是对于类的主动使用,因此不会初始化类public class MyTest8 { public static void main(String[] args) throws ClassNotFoundException { ClassLoader loader = ClassLoader.getSystemClassLoader();

2020-06-06 16:56:19 171

原创 jvm——几种常用的类加载器及其使用

示例代码/** * @author dc * @date 2020/6/6 - 16:02 */public class MyTest7 { public static void main(String[] args) throws ClassNotFoundException { Class<?> aClass = Class.forName("java.lang.String"); System.out.println(aClass....

2020-06-06 16:12:26 746

原创 jvm——类加载器7

1、示例代码/** * @author dc * @date 2020/6/3 - 16:10 */public class MyTest6 { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println("count1 = " + Singleton.count1); System.out

2020-06-03 16:23:01 93

原创 jvm——类加载器6

1、示例代码import java.util.Random;/** * @author dc * @date 2020/6/3 - 15:27 *//** 第一个接口初始化时,并不要求其父接口初始化* 只有真正使用到父接口的时候(如引用到父接口中的常量时),才会初始化父接口。* */public class MyTest5 { public static void main(String[] args) { System.out.println(MyChil

2020-06-03 16:10:01 67

原创 jvm——类加载器5

1、示例代码/**@author dc@date 2020/6/3 - 11:00*/public class MyTest4 {public static void main(String[] args) {//会主动使用MyParent4 myParent4 = new MyParent4(); System.out.println("=================="); //第二次创建实例不会主动使用类MyParent4 MyParent4 myParent5 =

2020-06-03 14:21:41 81

原创 jvm——类加载器4

1、示例代码import java.util.UUID;/** * @author dc * @date 2020/6/3 - 10:50 */public class MyTest3 { public static void main(String[] args) { System.out.println(MyParent3.str3); }}/** 当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,* 这时在程序运行时,会

2020-06-03 10:57:03 50

原创 jvm——类加载器3

1、示例代码/** * @author dc * @date 2020/6/3 - 9:44 */public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent2.str2); }}/** 常量在编译阶段会存入到调用这个常量的方法所在的常量池当中,* 本质上,调用类并没有直接引用到定义常量的类,因此并不会触* 发定义常量类的初始化* *

2020-06-03 10:25:24 43

原创 jvm——类加载器2

1、示例代码/** * @author dc * @date 2020/6/2 - 10:39 *//** 对于静态字段来说,只有注解定义了该字段的类才被初始化;* 当一个类被初始化时,要求其所有父类全部初始化完毕* */public class MyTest1 { public static void main(String[] args) { System.out.println(MyChild.str2); }}class MyParen

2020-06-03 10:23:12 58

原创 jvm——类加载器1

在java代码中,类型的加载、连接、初始化过程都是在程序运行期间完成的。加载:查找并加载类的二进制数据连接:验证:确保被加载类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值解析:把类中的符号引用转换为直接引用初始化:为类的静态变量赋予正确的初始值java程序对类的使用分为两种:1、主动使用2、被动使用所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化它们主动使用(七种)1、创建类的实例2、访问某个类或接口的静态变量,或者对该静态变量的赋

2020-06-03 10:19:22 60

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除