
Java底层原理
Java底层原理学习笔记
Juno99
这个作者很懒,什么都没留下…
展开
-
Java虚拟机的垃圾回收器介绍
一、GC分类与性能指标二、不同的垃圾回收器概述三、Serial回收器:串行回收四、ParNew回收器:并行回收五、Parallel回收器:吞吐量优先六、CMS回收器:低延迟七、G1回收器:区域化分代式八、垃圾回收器总结九、GC日志分析十、垃圾回收器的新发展...原创 2020-08-14 08:39:08 · 517 阅读 · 0 评论 -
垃圾回收相关概念
一、System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用(其实System.gc()的底层实现方法就是Runtime.getRuntime().gc()),会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行原创 2020-07-23 20:48:57 · 529 阅读 · 0 评论 -
JVM垃圾回收的相关算法
大厂面试题什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。原创 2020-07-20 19:16:13 · 464 阅读 · 0 评论 -
StringTable
String的基本特性String:字符串,使用一对""引起来表示String s1 = "Juno99"; //字面量的定义方式String s2 = new String("Juno99");String声明为final,是不可被继承的 String实现了Serializable接口,表示字符串是支持序列化的;实现了Comparable接口,表示String可以比较大小。 String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为by原创 2020-07-01 19:07:01 · 641 阅读 · 0 评论 -
执行引擎的作用及工作过程
执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种极其都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别原创 2020-06-22 16:57:29 · 1366 阅读 · 0 评论 -
深入理解Java虚拟机之直接内存
直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是Java堆外的,直接向系统申请的内存空间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。 通常,访问直接内存的速度要优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。如何去理解这一点呢?可以看下面两张图,既解释为什么访问直接内存的速度要优于Java堆,也解释了I原创 2020-06-18 16:20:34 · 650 阅读 · 0 评论 -
对象的实例化内存布局与访问定位
对象的实例化创建对象的方式:从创建对象的执行步骤来分析 对象的创建过程:判断对象对应的类是否加载、链接、初始化。虚拟机遇到一条new指令,首先去检查这个指令的参数能付在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundExcepti原创 2020-06-18 09:28:39 · 485 阅读 · 0 评论 -
深入理解Java虚拟机之方法区
栈、堆、方法区的交互关系方法区就是元空间,文章中可能会交替使用,不做赘述。从线程共享与否的角度来区分,如下图所示。从内存结构上来看的话,如下图所示。以一句最常用的代码——声明一个对象举例来看Person这个对象类型,也就是整个类的结构——.class文件是放在方法区的,而新new出来的这个对象是放在堆空间当中的,这一行代码如果是在方法中写的,那这个person就是一个引用类型的局部变量,是放在虚拟机栈中该方法的栈帧当中的。方法区在哪里《Java虚拟机规范》中明确说明.原创 2020-06-17 08:08:36 · 646 阅读 · 0 评论 -
Java虚拟机之堆空间
核心概述一个JVM实例值存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候就被创建了,其空间大小也就确定了,是JVM管理的最大一块内存空间。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(TLAB,Thread Local Allocation Buffer)。《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上(原创 2020-06-10 16:48:42 · 1478 阅读 · 0 评论 -
JVM虚拟机栈中关于方法的调用
在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制有关。静态链接与动态链接静态链接:当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时,这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。动态链接:如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称之为动态链接。对应的方法的绑定机制:早期绑定和晚期绑定早期绑定:早期绑定就是指被原创 2020-06-02 19:02:38 · 560 阅读 · 0 评论 -
深入理解Java虚拟机之虚拟机栈
出现背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的栈和堆栈是运行时的单位,堆是存储的单位。即,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放在哪里。Java虚拟机栈是什么?Java虚拟机栈,早期也叫Java栈,每个线程在创建是都会创建一个虚拟机栈,其内部保存一个个的栈原创 2020-06-03 11:23:35 · 643 阅读 · 0 评论 -
关于PC寄存器的两个问题
PC寄存器概念每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器用来存储指向下一条指令的地址,也即,将要执行的指令的代码,又执行引擎来读取下一条指令。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的,是线程私有的,就是一个指针。 是一个非常小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。也是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 这块内存区域很小,它是当前线程所执行的字节码的行号指原创 2020-05-26 12:37:03 · 2455 阅读 · 0 评论 -
Java类加载器之双亲委派机制
概念在学习双亲委派机制之前首先要了解Java类加载器以及类加载过程,参见我的另一篇博客:https://blog.youkuaiyun.com/Jhno99/article/details/106296449Java虚拟机对class文件采用的是按需加载的方式,也就是说,当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。工作原理如果一个类加载器收到了类加载请求,...原创 2020-05-25 21:54:49 · 441 阅读 · 0 评论 -
深入理解CAS
概念CAS,也就是compare and swap,比较并交换,是一条CPU并发原语,实现并发算法时常常用到的一种锁机制。它是区别于synchronized同步锁的一种乐观锁。synchronized关键字保证同步时是独占资源的,是悲观锁。原理CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么...原创 2020-04-27 16:20:21 · 587 阅读 · 0 评论 -
深入理解Java虚拟机
一、概念(什么是JVM) VM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序...原创 2020-04-14 09:56:16 · 1343 阅读 · 0 评论 -
git分支相关命令以及分支工作流
创建分支git branch <分支名> git branch -v 查看分支切换分支git checkout <分支名> 创建并切换到本分支 git checkout -b <分支名>合并分支先切换到主干 git checkout master (只有master才有merge操作权限) git merge <分支名>...原创 2020-04-08 20:42:56 · 209 阅读 · 0 评论 -
systemtcl restart 和systemtcl reload的区别
systemtcl restart 和systemtcl reload的区别restart = stop+ startreload = 重新读取配置文件其他CentOS7关于服务的常用命令restart = stop+ startreload = 重新读取配置文件有些服务是不提供reload功能的大部分服务的reload是不用重启服务,只是重新加载配置文件,这样就不会把服务停掉了。其他C...原创 2020-04-08 20:29:31 · 3176 阅读 · 0 评论 -
SpringMVC的工作流程
简洁明了,源自尚硅谷老师课件原创 2020-04-07 21:09:32 · 244 阅读 · 0 评论 -
SpringMVC中如何解决post和get请求的中文乱码问题
Post请求中文乱码解决方案最直观的方法就是配置过滤器在web.xml中添加如下代码块<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEnco...原创 2020-04-07 20:24:26 · 315 阅读 · 0 评论 -
Java基础知识
1. 重载和重写的区别:https://blog.youkuaiyun.com/wintershii/article/details/805587392. String 和 StringBuffffer、StringBuilder 的区别是什么?String 为什 么是不可变的? https://www.cnblogs.com/su-feng/p/6659064.html3.自动装...转载 2020-03-29 17:55:31 · 203 阅读 · 0 评论 -
Java单例设计模式(Singleton)
单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。例如:代表JVM运行环境的Runtime类要点某个类只能有一个实例 :构造器私有化 它必须自行创建这个实例:含有一个该类的静态变量来保存这个唯一的实例 他必须自行向整个系统提供这个实例:对外提供获取该实例对象的方式,可以直接暴露或者用静态变量的get方法获取常见形式1.饿汉式:直接创建对象,不存在线...原创 2020-03-28 10:47:00 · 215 阅读 · 0 评论