![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
乐七_
这个作者很懒,什么都没留下…
展开
-
JVM15_new String、StringTable的垃圾回收行为、G1的String去重操作
new String()到底创建了几个对象原创 2020-10-22 22:38:03 · 443 阅读 · 0 评论 -
JVM14_String的不可变性、内存分配、字符串拼接与append()、inter()、一道面试题??
String基本特性首先,String类是一个final类,所以是不可继承的,因为String类对字符串的刻画已经很完备了再一点,实现了Serializable接口,也就是String方式传输数据是可以实现跨进程的,因为已经是实现了序列化的机制实现了Comparable接口,所以String天生就可以进行排序从JDK1.9开始,String的底层实现不再是char[] 数组,而是变成了byte[]数组String存储结构的变更JDK8及之前,String实现是char[]数组,也就是每一原创 2020-10-22 20:17:51 · 177 阅读 · 0 评论 -
JVM13_执行引擎
直接内存从JDK8开始,出现了元空间,把方法区直接移到了直接内存中,回顾IO和NIOIO是阻塞式的,NIO(Non-blocking IO)非阻塞式IO是通过字节数组byte[]和字符数组char[]实现的stream流而NIO是通过Buffer实现的,使用Channel通道如果要操作直接内存,使用NIO的方式通过ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);来分配固定大小的直接内存使用IO的方式使用NIO的方式原创 2020-10-20 21:28:59 · 121 阅读 · 0 评论 -
JVM11_方法区、内存泄露和内存溢出
方法区、栈、堆三者的关系方法区如果保存了过多的类就会导致OOM比如1、加载了大量的第三方jar包2、tomcat服务器部署了过多工程(30-50个)3、大量动态生成反射类hotspot方法区的演进如果方法区是接口,那么永久代或者元空间就是方法区的具体实现,只是JDK8中把永久代换成了元空间元空间使用的是本地内存,而不是虚拟机内存在hotspot中,可以认为方法区和永久代是等价的,因为hotspot对方法区的实现就是使用的永久代。其他的虚拟机就没有永久代方法区参数设置jdk.原创 2020-10-19 15:49:56 · 562 阅读 · 0 评论 -
JVM12_StringTable、对象的实例化、对象的内存布局 、对象访问的两种方式、对象头信息
字符串常量池为什么要调整,从永久代放到对空间?其实就是因为字符串常量池在永久代中,回收效率不高,而开发中会产生大量的字符串,这样就会导致永久代内存不足。放在堆中,能及时回收内存静态变量首先,new出来的东西没有疑问,都是放到对空间中的,JDK中静态变量的变化,只是指的静态变量的引用存放的位置,JDK6是在永久代,JDK7和8放到了堆空间中jhsdb.exe是在JDK9时才出现的,监控进程的工具静态变量和映射的Class对象都放在了堆中方法区的垃圾回收行为对于方法区的回收行为,记住两点:原创 2020-10-19 15:49:27 · 138 阅读 · 1 评论 -
JVM10_堆空间之新生代老年代、内存分配过程、Minor GC(Young GC)、Major GC、Full GC、TLAB、逃逸分析
要想设置新生代中的比例,必须显式指定SurvivorRatio, 只是关闭自适应分配策略不管用对象内存分配过程图解自我总结过程:首先new的对象会放在Eden区,当Eden区满了以后会触发YoungGC(Minor GC),此时会把没有被GC的对象放到S0或者S1区,假设此时就是放到了S0区。当对象被放到S区开始,就会为这些对象分配一个age年龄计数器(当到了一定年龄对象就会被放到老年区)当Eden区再一次满了,又触发YGC,幸存的对象会被放到S1区,而之前S0区没有被YGC的...原创 2020-10-16 16:23:08 · 472 阅读 · 0 评论 -
JVM09_本地方法接口、本地方法栈、堆的介绍及内存分配、IDEA设置编译时环境和运行时环境
本地方法使用native修饰的方法是本地方法,不能和abstract放在一起。因为native的意思是调用本地方法,非java的方法,虽然看起来没有方法体,但是存在方法实现而abstract是指抽象方法,是java层面的,它修饰的方法不能有方法体,必须由它的子类重写本地方法栈堆一个JVM实例就是一个进程,运行一个java程序,也就是把编译产生的class文件放到JVM实例中执行,一个JVM实例就对应一个进程。一个JVM实例中只会存在一个堆空间和方法区,所以是线程共享的在堆中并原创 2020-10-14 20:26:50 · 168 阅读 · 0 评论 -
JVM08_方法的重写、栈帧之方法返回地址和一些附加信息、一些面试题
虚方法表上例中,因为存在虚方法表,所以对于toString()\hashCode()这种方法,就不会再去Son的父类向上找,直接找的就是虚方法表中的方法入口,加快执行效率方法返回地址存储的就是调用该方法的指令的下一条指令地址,也就是下一个方法或者栈帧。这样返回给调用者的PC寄存器,就知道下一条该执行那个指令了方法执行后,退出方法的两种情况:1、正常完成出口 return2、出现异常,会在异常处理表中找对应的处理异常的代码。如果异常表中没有异常处理器,就会导致方法退出这种是异常完成出.原创 2020-10-11 20:40:57 · 193 阅读 · 0 评论 -
JVM07_栈帧之动态链接,方法的调用、动态语言类型和静态语言
对于帧帧中的其他三部分:方法返回地址、动态链接和一些附加信息,可以统称为帧数据区动态链接java源文件被编译成class字节码文件的时候,会把所有变量和方法的引用作为符号引用保存到class文件的常量池中如下图Constant pool, # 加数字就是符号引用。也就是把当前class文件需要的资源都做了符号引用。使用时就使用符号引用。每一个栈帧中都存在一个动态链接,存的就是指向常量池的引用所以动态链接也叫:指向运行时常量池的方法引用class文件中的常量池,在class运行起来后原创 2020-10-11 17:31:43 · 456 阅读 · 0 评论 -
JVM06_栈帧之操作数栈
操作数栈操作数栈和局部变量表都是用的数组结构,数组一旦创建,那么长度就固定了。但是操作数栈不会采用访问索引方式进行数据访问代码追踪bipush:byte、short、char、boolean都是以int型来保存,bi代表int型局部变量表和操作数栈都是基于数组的栈实现的第一步:bipush是把byte类型转换成int进行保存PC寄存器中就是保存的指令地址,bipush把15压入操作数栈,int占两个字节,所以下一个指令从2开始istore_1:表示把int类型的值从操作数栈取出原创 2020-10-11 15:17:46 · 231 阅读 · 0 评论 -
JVM05_虚拟机栈(java栈)之 栈帧,局部变量表
是什么栈的特点栈帧是虚拟机栈中的基本单位,一个栈帧对应一个方法,比如上边,methodA执行,出现一个栈帧,接着methodA中调用了methodB,压入了另一个栈帧,栈顶的栈帧表示当前方法。方法B执行完以后就弹出栈,那么方法A就成了当前方法。栈只存在OOM,不存在GC面试题开发中遇到哪些异常演示栈溢出通过 -Xss256k设置虚拟机栈的大小2、栈的存储单位方法和栈帧是一对一关系:方法执行,那么对应栈帧入栈,方法执行结束对应栈帧出栈栈运行原理抛出异常指的是...原创 2020-10-07 23:17:22 · 245 阅读 · 0 评论 -
JVM01_简介
文档下载https://docs.oracle.com/javase/specs/index.html两个文档:语言规范和虚拟机规范参考书周志明老师的书推荐JVM:跨语言的平台。java:跨平台的语言JVM不仅可以解释java程序,其他编程语言也可以解释,只需要不同语言提供各自的编译器,编译出的字节码文件遵循JVM的规范,就可以运行从JDK11开始,每次都会发布两个版本的JDK:一个OpenJDK、一个OracleJDKOpenJDK支持期只有半年,半年以后如果发现JDK存在.原创 2020-10-05 09:25:11 · 232 阅读 · 0 评论 -
JVM04_运行时数据区、PC寄存器
运行时数据区概述线程共用方法区和堆空间每个线程各自有各自的程序计数器,本地方法栈,虚拟机栈95%的垃圾回收发生在堆空间线程如果run方法可以正常执行完,或者出现异常有相应处理,那么java线程和本地线程都会回收,资源释放如果执行run方法时出现异常未被处理,那么java线程就终止,此时本地线程决定jvm到底要不要终止。如果只剩下守护线程,那么jvm就可以终止了。程序计数器(PC寄存器)https://docs.oracle.com/javase/specs/jvms/se8/h原创 2020-07-23 18:28:50 · 196 阅读 · 0 评论 -
JVM03_类加载器、双亲委派机制、沙箱安全机制
类加载器的分类所有派生于抽象类加载器的都划分为了 自定义加载器,也就是说,除了引导类加载器,其他的都是自定义加载器,包括扩展类,系统类加载器等Bootstrap Class Loader是C和C++实现的,其他是java实现的默认使用的是系统类加载器public class ClassLoaderTest { public static void main(String[] args) { //获取系统类加载器 ClassLoader systemCla原创 2020-07-21 13:05:06 · 154 阅读 · 0 评论 -
JVM02_类加载器子系统、类加载过程
内存结构类加载子系统类加载过程链接阶段一个JVM能运行的class文件都是以CAFEBABE开头的初始化阶段,理解记忆使用Binary Viewer 把字节码文件打开,这其中的字节码一个个翻译后就是ByteCode viewer的结果类成员number声明在下边,赋值在上边,这种写法也是可以的因为:在链接阶段准备时,就给类成员进行了分配内存并赋值为0,然后才从上到下赋值并覆盖,最终结果是10变量number的声明发生在后边,在前边的静态代码块中可以赋值,但是不可以调原创 2020-07-21 00:05:54 · 177 阅读 · 0 评论