
JVM基础
敏叔V587
吃货程序员一枚
展开
-
自定义类加载器
什么时候需要类加载器?1.想加载非classpath随意路径中的类文件2.都是通过接口来实现,希望解耦时候,常用在框架设计3.这些类希望予以隔离,不同应用的痛类名都可以加载,不冲突步骤1.继承ClassLoader父类2.要遵从双亲委派机制,重写findClass方法注意不是重写loadClass,否则不会走双亲委派的机制3.读取类文件的字节码4.调用父类的defineCl...原创 2020-03-06 19:24:59 · 200 阅读 · 0 评论 -
双亲委派源码分析
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the clas...原创 2020-03-06 13:54:23 · 614 阅读 · 3 评论 -
DirectByteBuffer内存释放原理
要了解DirectByteBuffer底层,我们需要了解一个Java里面的Unsafe类,这个类不能直接获取,只能通过反射的方式获取,对应代码如下:import sun.misc.Unsafe;import java.io.IOException;import java.lang.reflect.Field;public class Jvm1_27 { static int _1G...原创 2020-01-13 22:30:56 · 2029 阅读 · 0 评论 -
DirectMemory内存回收
既然DirectMemory不受jvm管理,那么这部分内存是不是不会回收呢,这次来探索这个话题。当然还是来一段代码:public class Jvm1_26 { static int _2G=1020*1024*1024*2; public static void main(String[] args) throws IOException { ByteBuff...原创 2020-01-12 20:11:40 · 598 阅读 · 0 评论 -
Direct buffer OutOfMemoryError
既然Direct memory是物理内存,那么是不是不受限制呢,这个肯定不是的。我们来一段程序:public class Jvm1_10 { static int _10M=1024*1024*10; public static void main(String[] args) { List<Buffer> list=new ArrayList&l...原创 2020-01-12 19:48:20 · 436 阅读 · 0 评论 -
Direct Memory读写流程分析
之前我们看出来了直接内存和传统IO操作的区别,我们针对底层流程加以说明。BybeBuffer方式如图所示,我们一般的IO读取过程时,程序需由用户态切换成内核态,当从ByteBuffer中读取数据时,系统会先从磁盘把文件读取到系统内存区,再从系统内存读取到Java堆内存,需要多一次内存拷贝过程。Direct Memory方式Direct Memory方式情况下,Java程序会直接从系统内存...原创 2020-01-12 15:20:48 · 416 阅读 · 0 评论 -
直接内存(Direct Memory)牛刀小试
Direct Memory特点常见于NIO操作时,用于数据缓存分配回收成本较高,但是读写性能高不受JVM内存回收管理原创 2020-01-12 14:04:48 · 565 阅读 · 0 评论 -
StringTable垃圾回收跟踪案例
引言很多人认为jvm字符串常量不会被回收的,其实这个说法的有误区的,我们通过一些jvm参数可以看到StringTable的垃圾回收。参数说明原创 2020-01-11 21:52:45 · 926 阅读 · 1 评论 -
StringTable暴涨导致的OutOfMemoryError案例分析
jdk8中的StringTabel是放在堆空间的,我们分析一个案例说明。public class Jvm1_6 { public static void main(String[] args) { List<String> list=new ArrayList<>(); int i=0; try { ...原创 2020-01-11 21:13:12 · 321 阅读 · 0 评论 -
浅谈JVM内存结构
文章目录内存结构程序计数器定义作用特点虚拟机方法栈定义栈内存结构线程运行诊断本地方法栈堆方法区内存结构程序计数器定义Program Counter Register 程序计数器(寄存器)作用记住下一条JVM指令执行的地址特点是线程私有的,就是每个线程都有自己的计数器不会存在内存溢出,这个是直接在JVM规范中规定的,所以各大厂商不用去考虑程序计数器中的内存溢出问题...原创 2019-12-28 14:17:34 · 184 阅读 · 0 评论 -
堆内存的溢出案例分析
为了针对性研究堆内存溢出问题,专门准备了一段程序:import java.util.ArrayList;import java.util.List;public class Jvm1_5 { public static void main(String[] args) { int i=0; try{ List<String...原创 2020-01-08 21:57:49 · 516 阅读 · 0 评论 -
StringTable特性总结以及案例分析
串池总结常量池中的串仅仅是符号,第一次用到时才变为对象利用串池的机制,来避免重复创建字符串对象字符串变量拼接的原理是StringBuilder,并且会通过new生成新的对象,新对象是堆中的对象字符串常量拼接的原理色编译器优化可以使用intern方法,主动将串池中还没有的字符串对象放入串池中1.8中将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返...原创 2020-01-11 20:36:46 · 603 阅读 · 0 评论 -
字符串懒加载的证明
字符串是懒加载的,运行的时候相同的字符串会在串池中保存,怎么去证明这件事呢?其实方法很简单,我们利用Idea中的调试就可以看到内存中对象的状态。准备代码:import com.sun.tools.attach.AttachNotSupportedException;import sun.tools.attach.HotSpotVirtualMachine;import java.io.B...原创 2020-01-11 19:18:34 · 385 阅读 · 1 评论 -
字符拼接的深入理解
字符串拼接在日常中编码中大量使用,但是对底层的原理却缺乏理解。我们还是从一段代码开始:public static void main(String[] args) throws Exception{ String s1="a"; String s2="b"; String s3="ab"; String s4=s1+s2; ...原创 2020-01-11 16:55:37 · 319 阅读 · 0 评论 -
常量池和串池的关系
字符串在我们日常中大量使用,我们希望通过字节码层面看看我们定义了字符串变量时候是什么行为。我们拿一段代码进行分析:public class Jvm1_22 { public static void main(String[] args) { String s1="a"; String s2="b"; String s3="ab"; ...原创 2020-01-11 16:29:30 · 1181 阅读 · 3 评论 -
运行时常量池
常量池就是字节码中的那张常量表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息。运行时常量池常量池是*.class文件中的,当该类被加载,它的常量池信息局会被放入运行时常量池,并把里面的符号地址变成真实地址。Constant pool: //常量池部分 #1 = Methodref #6.#20 // java/lang...原创 2020-01-11 15:34:35 · 154 阅读 · 0 评论 -
解读HelloWorld字节码
上一篇文章我们拿到了HelloWorld的字节码,这回我们来搞他,我稍微整理一下,我们一起来研究。字节码的组成1.首先是类主体的定义部分,包括了我们的类版本号,访问修饰符public class HelloWorld minor version: 0//次版本号 major version: 52//主版本号52对应jdk1.8 flags: ACC_PUBLIC, ACC_SU...原创 2020-01-11 15:24:40 · 692 阅读 · 0 评论 -
反编译HelloWorld,不再觉得这个程序简单
HelloWorld是我们写下的第一个程序,源码如下:public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }}若干年之后我们回过头来再看这个程序,我们不再会觉得这个程序简单。任何一个Java程序要运行,我...原创 2020-01-11 14:18:48 · 787 阅读 · 0 评论 -
java.lang.OutOfMemoryError: Metaspace
场景说明jdk8中把方法区实现移动到了元空间中,我们还原一次元空间溢出的场景:import com.sun.xml.internal.ws.org.objectweb.asm.ClassWriter;import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;/** * 永久带内存溢出 * -XX:MapPermSize=8m jd...原创 2020-01-11 13:04:45 · 1573 阅读 · 0 评论 -
JVM方法区详细定义
#1 定义方法区的定义很多地方比较含糊,我这里找到最权威的定义——jvm规范中的定义,链接参考摘录方法区部分的定义:2.5.4. Method Area The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is an...原创 2020-01-09 23:41:35 · 1015 阅读 · 0 评论 -
JVM堆内存诊断
关于堆内存的诊断,我们主要用下面的工具:jps工具,可以查看当前系统中有哪些java进程jmap工具,查看堆内存占用的情况jconsole工具,图形界面的,多功能监测工具,可以连续监控我们用具体的案例来说明工具的使用:public class Jvm1_4 { public static void main(String[] args) throws Interrupted...原创 2020-01-08 23:40:40 · 631 阅读 · 0 评论