JVM
文章平均质量分 96
探讨java运行的底层奥秘
SunAlwaysOnline
开始工作的第3年!
展开
-
new一个对象的背后,竟然有这么多可以说的
作为一名java开发工程师,每天要处理上千个对象,你居然说我没对象?就算没有对象,那就new一个呗。 GirlFriend gf = new GirlFriend();不会就这么容易吧?当然不会!那么GirlFriend对象到底是怎么产生的呢?一、类加载当遇到new指令时,jvm首先去常量池寻找该类的符号应用,找不到,则执行类加载。以下是类加载各个阶段的主要任务,现在记不住也没有什么关系。1. 装载我觉得这里使用装载更好一点。第一,可以避免与类加载过.原创 2021-09-17 22:20:04 · 3160 阅读 · 7 评论 -
还不清楚JDK动态代理?从简单例子到源码再到字节码讲给你听
一、前言Spring中的AOP思想就是对代理模式的经典运用,下面先讲讲代理模式的核心思想,以静态代理为例。二、静态代理示例下面有这样一个例子,委托人在遭遇利益受损的时候,可以委托律师帮忙打官司。先定义一个描述行为的接口:package com.design.proxy.statics;public interface Action { void handle();}委托人,实现这个接口,主要的行为是寻找律师。package com.design.proxy.s原创 2021-09-10 00:00:45 · 973 阅读 · 0 评论 -
深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?
要说双亲委派机制,还得从类加载器的类型谈起一、类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器原创 2021-09-05 22:47:01 · 2666 阅读 · 9 评论 -
面试常问集锦——线上排查部分
实操线上故障如何快速排查?来看这套技巧大全https://mp.weixin.qq.com/s/PWNnq07cPYB4o421VFEFHwJAVA线上故障排查全家桶https://mp.weixin.qq.com/s/UTGtusIyScJGOjdZPdU4Ugcpu飚高怎么处理CPU占用100%排查过程 - 云+社区 - 腾讯云(1)top 通过top命令找到,找到最耗CPU的进行PID,从下图种可以发现PID为 15913不断按P可以按照CPU使用率进行排序(2原创 2021-04-01 22:40:52 · 2585 阅读 · 0 评论 -
面试常问集锦——JVM部分
jvm1、新生代和老年代的垃圾回收策略标记清除标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。复制算法从根集合节点进行扫描,标记出所有的存活对象,并将这些存活的对象复制到一块儿新的内存(图中下边的那一块儿内存)上去,之后将原来的那一块儿内存(图中上边的那一块儿内存)全部回收掉标记整理复制算法的高效性是建立在存活对象原创 2021-04-01 22:37:33 · 1219 阅读 · 0 评论 -
如何排查java应用的死锁
首先,我们构造一个死锁场景。如何构造一个死锁呢?原创 2020-08-04 22:13:12 · 501 阅读 · 0 评论 -
浅谈JVM调优中的两个小知识点
对JVM的调优,需要大量的场景以及经验,本篇主要是从一个理论的角度,粗浅地对堆这边不太熟悉的同学,可以先参考我的这一篇文章说说java中的堆区我把堆区的主要结构以及参数放在下面,这样可以参照着图来看:一、如何设置最大年龄每发生一次Young GC,就会将Eden区和当前的Survivor区的存活对象一次性地转入到另外一个Survivor区中,并将之前的Eden区以及Survivor区清空。所以年轻代的存活对象,基本上就是在两块Survivor区中换来换去,每换一次,年龄增加1岁。当到达最原创 2020-08-03 22:44:10 · 322 阅读 · 0 评论 -
【JVM】对象的内存布局,怎样确定对象的大小
一个对象在内存中究竟是怎样进行布局的,如何依据代码去确定对象占据的大小,本文将进行粗略地探讨。对象在内存中的布局,主要有3个组成部分,包括对象头,实例数据与对齐填充。确定对象的大小,也是从这3个组成部分的入手。对象头其中对象头中又包括Mark Word与Klass Word。当该对象是一个数组时,对象头还会增加一块区域,用来保存数组的长度。以64位系统为例,对象头存储内容如下图所示:|-----------------------------------------------------原创 2020-05-12 18:22:55 · 3123 阅读 · 1 评论 -
【JVM】class文件结构2——类索引、超类索引与接口表索引
1、类索引类索引紧随在类访问标记之后,占两个字节,里面存储一个指向常量池的一个索引,用于指出该class文件的全限定名。以下面这个简单的java类为例:package com.yang.testFlag;public class Main {}其16进制数据:可以看到,类索引为0x0002,代表指向常量池的第二个常量项,而常量池内容为:第二个常量项又指向第11个常量项,即“com/yang/testFlag/Main”字符串,即这个类索引能告诉我们,该class文件原创 2020-05-11 16:33:57 · 815 阅读 · 0 评论 -
【JVM】class文件结构1——魔数、版本号、常量池与类访问标记
1、魔数我们可以利用editplus,以16进制的编码格式来查看class文件的结构,具体操作方法为在editplus的工具栏中点击Edit,下拉选择Hex Viewer即可。如图所示,前四(4个bit位*8个字母=32,32/8=4字节)个字节为0xCAFEBABE,这就是class文件的魔数。虚拟机借助魔数,用来识别.class 文件,虚拟机在加载类文件之前会先检查魔数,如果不是 0xCAFEBABE 则拒绝加载该文件。关于class文件魔数的由来,可以参考这篇文章class文件魔数原创 2020-05-11 16:28:50 · 1216 阅读 · 0 评论 -
【JVM】class文件结构3——字段表与方法表
1、魔数我们可以利用editplus,以16进制的编码格式来查看class文件的结构,具体操作方法为在editplus的工具栏中点击Edit,下拉选择Hex Viewer即可。如图所示,前四(4个bit位*8个字母=32,32/8=4字节)个字节为0xCAFEBABE,这就是class文件的魔数。虚拟机借助魔数,用来识别.class 文件,虚拟机在加载类文件之前会先检查魔数,如果不...原创 2020-05-11 16:35:42 · 1443 阅读 · 0 评论 -
【JVM】类加载器与双亲委派模型
类加载器在加载阶段,会将class文件加载进方法区。有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加...原创 2020-04-29 11:21:11 · 1136 阅读 · 0 评论 -
【JVM】虚拟机栈的五脏六腑
虚拟机栈,本身就是一个普通的栈,栈中的元素叫做栈帧。虚拟机栈是线程私有的,每有一个线程,虚拟机就会创建一个虚拟机栈,线程与虚拟机栈一一对应。线程每调用一个方法,虚拟机就会创建一个栈帧,并将此栈帧压入虚拟机栈中,当方法调用结束后,此栈帧又从虚拟机栈中弹出。线程每调用一个方法,都会起一个栈帧,因此栈帧的容量偏小,栈帧虽小,却五脏俱全。栈帧包含局部变量表、操作数栈、动态链接...原创 2020-04-27 21:39:55 · 1458 阅读 · 0 评论 -
【JVM】类的奇幻漂流——类加载机制探秘
1. 装载我觉得这里使用装载更好一点,第一,可以避免与类加载过程中的“加载”混淆,第二,装载体现的就是一个“装”字,仅仅是把货物从一个地方搬到另外一个地方而已,而这里的加载,却包含搬运货物、处理货物等一系列流程。装载阶段,将.class字节码文件的二进制数据读入内存中,然后将这些数据翻译成类的元数据,元数据包括方法代码,变量名,方法名,访问权限与返回值,接着将元数据存入方法区。...原创 2020-04-24 16:56:53 · 1359 阅读 · 0 评论 -
【JVM】灵性一问——为什么用元空间替换永久代?
前言首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。方法区与永久代,元空间之间的关系方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版...原创 2020-04-20 16:44:12 · 5089 阅读 · 1 评论 -
【JVM】说说java中的堆区
堆(Heap)是被虚拟机所管理的最大的一块内存区域,在堆中,会有以下一些对象:朝生夕死的小对象,蜉蝣一般 大对象,例如长数组,需要大量连续的内存空间 长周期对象,存活很久,很能熬因此,目前主流的JVM,利用可达性分析算法分析对象是否死亡,最后针对性地采用分代搜集算法回收死亡对象。判断对象是否死亡,可以先参考我的另外一篇文章【JAVA】如何判断对象已经死亡?堆可以分为新生代与老年代,用...原创 2020-04-15 11:33:34 · 1480 阅读 · 1 评论 -
【JAVA】初探switch实现原理
日常编码中,我们常常用到switch语句,在我的另外一篇文章中【JAVA】优化if else的几种方式,也谈到了可以利用switch来优化if-else结构,那么switch底层究竟是如何实现的呢?我们先写几个示例第一个示例:case条件中的int值连续 public int switchInt(int i) { int result; swit...原创 2020-04-09 14:50:09 · 2037 阅读 · 2 评论 -
【JAVA】Lambda执行原理
在我的想法里,Lambda长得很奇怪,虚拟机真的认识这玩意吗?还是说,Lambda经过编译后,脱掉了伪装的衣服,变成了大家熟知的方法?对Lambda不熟悉的同学,可以先看我的另外两篇文章。【Java8】对Lambda的理解 【JAVA8】快速理解Consumer、Supplier、Predicate与Function...原创 2020-04-03 10:06:46 · 1996 阅读 · 1 评论 -
【JAVA】对泛型擦除的一点思考
一、什么是泛型擦除泛型(generics)的真正面目,是参数化对象类型。在使用泛型的时候,我们总是把一个具体的对象类型当作一个参数传入。泛型的作用就是发生在编译时,它提供了安全检查机制。可是当处于编译时,所有的泛型都会被去掉,即被还原为原始类型,如java.util.ArrayList,不再有"<T>"。二、代码验证创建一个List<String>与Li...原创 2020-03-31 18:24:54 · 782 阅读 · 0 评论 -
Java内存溢出(OOM)异常完全指南
这也许是目前最为完整的Java OOM异常的解决指南。1、java.lang.OutOfMemoryError:Java heap spaceJava应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)和Permgen(永久代):JVM内存模型示意图这两个区域的大小可以在JVM(Java虚拟机)启动时通过参数-Xmx和-XX:Max...转载 2019-11-11 11:37:47 · 1207 阅读 · 0 评论 -
【JAVA】堆、栈与方法区
一、Java中的内存管理:1、程序,无论是代码还是数据,都需要存储在内存中,JVM为Java程序提供并管理所需要的内存空间。2、JVM内存分为堆(heap)、栈(stock)、方法区(method)三个区域,分别用于储存不同的数据。3、HotSpot是Sun JDK和Open JDK中所带的虚拟机(Sun JDK和Open JDK除了注释,代码实现基本上是相同的)。下面我们来分别了解一...转载 2019-10-25 13:42:11 · 10987 阅读 · 2 评论 -
【JAVA】谈谈内存泄露
谈谈内存泄露应届生面试中,常常被问到内存泄露,比方说什么是内存泄露呀?造成内存泄露的情况等等。本菜今天就总结一下内存泄露方面的几点小知识。一、什么是内存泄露不再被使用的对象持续占据内存,造成内存浪费的情形称作内存泄露。这些对象被某些变量引用着,因此垃圾回收器无法回收它们。关于垃圾回收器如何判断...原创 2018-11-17 19:30:29 · 4680 阅读 · 0 评论 -
【JAVA】JVM、JRE与JDK的区别
JVM、JRE与JDK的区别相信初学者一直搞不懂这三者的区别,导致了在安装过程中,有些人安装了JDK后,又安装了JRE,其实再安装JRE是没有必要的。一、JVMJVM(Java Virtual Machine),是java虚拟机。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真...原创 2018-09-13 22:08:09 · 8302 阅读 · 2 评论 -
【JAVA】运行时数据区浅谈
运行时数据区浅谈了解jvm内存区域的划分,有助于我们在内存泄露和内存溢出的时候快速排查错误。jvm将内存划分为如下的几个区域:(1)程序计数器(Program Counter Register)当前线程所执行的字节码的行号指示器,或者说字节码指令指示器。特点:【1】线程独立。这个特点要从多线程的...原创 2018-09-09 18:41:08 · 4702 阅读 · 0 评论 -
【JAVA】如何判断对象已经死亡?
如何判断对象已经死亡?JVM在进行垃圾回收时,要做的第一件事情,就是去寻找那些已经没有任何变量引用的对象,从而对此类对象进行回收。那么,JVM是如何判断对象已经死亡了呢?一、引用计数法程序给对象添加一个引用计数器,每有一个变量引用它时,计数器加1。当引用断开时,计数器减1。当计数器为0时,代表...原创 2018-08-27 10:49:44 · 15398 阅读 · 4 评论 -
【JAVA】java中的四种引用
java中的四种引用JDK1.2之后,把对象的引用分为四种状态,即强引用、软引用、弱引用和虚引用。这样的方式,可以更加灵活地控制对象的生命周期。一、强引用开发中用的最多的就是强引用了。强引用声明格式:String str="abc";只要某个对象与强引用关联,那么JVM在内存不足的...原创 2018-08-25 13:43:34 · 30750 阅读 · 15 评论