JVM
文章平均质量分 78
Java虚拟机详解
学习时长两年半的小学生
我要一步一步往上爬~
展开
-
记一次OOM与内存泄漏排查经历
场景:测试环境有个应用容易爆OOM,导致容器也会不断重启,大佬怀疑是内存泄漏导致的,于是对它进行排查登陆上对应的服务器,安装ArthasArthas使用指南查看仪表盘:dashboard开始压测前开始压测后:堆内存比较满,而且是survivor区和eden区占用率飙升严重,右上角垃圾回收次数不断增加,eden区回收占用时间较长但是还不能确定是否存在内存泄漏,所谓内存泄漏,也就是内存脱离JVM的控制,无法对泄漏的内存进行回收利用,测试方法是手动GC:jcmd XXX(Java应用的进程号原创 2021-05-12 15:22:58 · 385 阅读 · 1 评论 -
Java的checked Exception 和 unchecked Exception
先看基本的异常结构层次图:首先用网络上的说法总结一下:Error 和Runtime Exception 都属于 unchecked exception。除了RuntimeException之外的,都是 checked exception。关于checked Exception 和 unchecked Exception的解析,网上五花八门,但是本人比较笨,看上去都很难理解,所以我想要的就是最通俗易懂地用自己的话来总结出来。先从字面上简单理解,checked exception 直译就是 “已经被确原创 2020-10-26 14:03:03 · 505 阅读 · 0 评论 -
javaer面试必问:JVM调优
这是一个很广泛的问题,主要目标是使用较小的内存来获得较高的吞吐量或者较低的运行时延迟卡顿。落实到具体的话本人总结有以下措施(持续补充中…):针对于内存的:(1)选择合适的垃圾回收器。由于堆的分代就是为了更好的管理内存,更方便回收内存,所以我们可以设置指定的垃圾回收器。在idea中VM Option参数加上下面的:-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。-XX:+UseParNewGC,ParNew+Serial Old,在JDK原创 2020-09-24 11:28:42 · 197 阅读 · 0 评论 -
Lock锁+CAS+与Synchronized比较
在大学时代接触Synchronized后,做的实验就一直用它处理线程安全问题。但是我们都知道它都是块状的粒度,粗大粗大的毛孔,喷着厚重的气息,方法执行到同步块,性能抖三抖,加在方法上,就锁住了整个实例对象,静态方法上,还锁住了整个类,所有这个类的实例对象都不能避免。monitorenter和monitorexit监视器实现的同步,虎视眈眈地看着每一个蹑手蹑脚进来的线程。步步紧跟,直到执行完同步块释...原创 2020-03-06 20:37:57 · 2073 阅读 · 0 评论 -
从Executors和ThreadPoolExecutor的区别分析到线程池的OOM
很多人都知道阿里的Java开发严令禁止使用Executors的方式来创建线程池,禁止的理由是“为了让开发者更加明确线程池的运行规则,更加了解线程池的底层工作原理,从而避免不规范的使用造成服务器资源耗尽的风险”,本菜鸡曾经也是在UC原生团队呆过一年,在内部的开发手册上也确实记录了很多这些Java ,mysql的规范。当时由于业务繁忙,也没深究,造成了极大的浪费,其实很矛盾,带我的那位私有云的架构师大佬每天都叫我多学习,但是本菜鸡每天都在堆砌着业务逻辑代码,加班完回家一般都九点十点了,自己偷偷懒,又不看了。于是原创 2020-09-08 16:52:33 · 742 阅读 · 0 评论 -
Java反射机制(看完详解例子还不懂,留言骂我)
先来一张百度镇楼图看下概念!在运行状态中,对于任意一个类都能知道这个类的全部属性和方法,对于任意一个对象都能调用它的任意属性和方法。听起来既苦涩难懂又牛逼哄哄。举个大家都听得懂的例子:先假设有个场地租给三个商家:(一套系统里有三个类)(1)烤羊肉串的(类的具体的实现),要求自己档位装修得异域风情(属性),有翻滚烧烤架和自动化炭火盆(方法)(2)卖茶叶的(类的具体的实现),要求档位要古...原创 2020-02-04 22:03:00 · 348 阅读 · 0 评论 -
Java系统性能监控工具Arthas的使用
Arthas工具有什么用具体百度。安装:打开iterm;输入: curl -O https://alibaba.github.io/arthas/arthas-boot.jar出现类似这些的就是完成了。启动:直接:java -jar arthas-boot.jar这样就是完成了,可以看到罗列了很多的进程出来,我们输入要监控的那个进程前面那个编号1,2,3,4就可以。容易报错:[...原创 2020-04-28 16:22:11 · 1006 阅读 · 2 评论 -
JVM垃圾收集子系统(七大垃圾收集器+垃圾收集算法+引用计数/可达性分析+finalize())
Serial收集器(新生代收集器):出现最早,资格最老的一个垃圾收集器。单线程的收集器,所有用户线程执行到这里,都会暂停,执行垃圾回收的保护线程。缺点:会造成卡顿,用户体验效果差,分配内存空间大的场景下回收效率差,卡顿时间长。优点:单线程省去了切换线程的开销,内存较小的应用回收效率较高。一般应用于客户端桌面应用的垃圾回收。回收算法:复制算法 或者称为 标记-复制算法标记复制...原创 2020-02-10 14:48:48 · 311 阅读 · 0 评论 -
守护线程和非守护线程(保姆与婴儿的故事)
面试JVM的一个问题之一Java是多线程,但是线程的类型分两种:User Thread(非守护线程/用户线程)、Daemon Thread(守护线程)。用户线程:就是通过main()方法调用开始,主动调用的工作线程,也可以通过创建线程后的thread.setDaemon(true) 将当前线程转为守护线程。守护线程:通常是由JVM调用的,例如垃圾回收等线程。它们之间的关系是:守护线程的...原创 2020-02-10 10:55:12 · 149 阅读 · 0 评论 -
Synchronized锁(大妈炒菜例子)
Java中要防止多线程访问同一临界资源时候发生抢夺,进而导致资源数据出错的情况,我们都要在对应的代码块或者方法中加Synchronized关键字,这个关键字,注意不是Java一个方法,只是一个关键字,它就是让多线程在执行到这个方法的时候,一次只允许一条线程访问操作,其它线程都在等待状态。举例翻译:一个超市做活动,免费提供锅和煤气给顾客自己动手炒菜,中国大妈蜂拥而上,不排队,有的自己的菜还没炒熟,...原创 2020-02-07 12:48:16 · 542 阅读 · 0 评论 -
Java重排序
之前听公司讲座说到的设计模式,经典的懒汉式单例模式会有重排序问题,当时不是很理解,后来深入学了JVM终于恍然大悟,这里做个总结分享。重排序排序的就是操作指令的顺序,改变了指令的执行顺序。重排序首先要知道字节码.class文件,它就是JavaC编译后的那个字节码文件,它里面有操作指令的执行顺序,程序计数器就是根据字节码的操作指令的顺序进行寻址查找属性和方法进行操作。JVM会自行判断,把速度快的逻辑...原创 2020-02-06 21:47:06 · 928 阅读 · 0 评论 -
双亲委派模式和类加载器(自定义类加载器和如何打破双亲委派)
类加载器就是加载一个类的一块功能代码,实现了将类通过加载全过程。进而将类放到内存分配空间和初始化,再接下来就是愉快的使用类里面的属性和方法完成自己的业务开发需求啦。类加载器有很多种,主要是为了根据Java定义的项目目录结构去加载不同的路径下的类,一般都是根据功能类型划分。类加载器的分类:(1) BootStrapClassLoad启动类加载器主要负责加载lib文件夹目录下的jar包。(id...原创 2020-02-02 13:34:53 · 305 阅读 · 0 评论 -
Java类加载全过程
类加载全过程这个基础章节的博客也是很早之前就想做个总结的了,直奔主题(1)加载加载JAVA编译阶段后产生.class文件,里面有各种表,各种属性和方法描述。所以第一步进行的加载阶段,就是通过一个C++的instanceKlass加载器读取.class字节码文件,并且在元空间(方法区)生成一个.class类对象,它加载时会产生一个_JAVA_MIRROR镜像对象放在堆中。(2)验证校验类的字...原创 2020-02-01 19:29:00 · 394 阅读 · 0 评论 -
重写与重载 / 动静态分派调用(JVM字节码底层逐步解析,吃鸡例子简单易懂)
面试混分巨兽!网络千遍一律标准答案如下:(1)两者都是面向对象中实现多态的方式,两者与父类方法名都必须相同,两者都允许子类根据自己需要重新实现父类方法。(2)重写是运行时的多态,重载是编译时的多态。(3)重写必须保持与父类方法一样的参数列表,一样的返回值。重载是返回值类型不同或者参数列表不同(参数列表的类型,个数等等)。背题去面试的足够了。下面开始讲重写和重载的原理,会有点苦涩:我曾经也...原创 2020-01-30 23:00:28 · 253 阅读 · 0 评论 -
JVM的字节码指令(一步步读懂.class字节码文件的操作指令)
刚上大一那会儿就是随便一个编译器写.java后缀文件,然后通过命令行JavaC编译那个.java后缀的文件生成.class文件,然后直接java XXXX.class文件就可以运行自己的Java程序。所以知道,Java 程序执行分两个阶段,编译阶段和运行阶段:JavaC :这个命令就会启动Java的编译器去对Java后缀文件进行编译,生成字节码,也就是.class文件,这个文件是十六进制格式的...原创 2020-01-30 11:30:45 · 1054 阅读 · 0 评论 -
动态类型语言与静态类型语言
静态类型语言:变量类型在编译阶段可以确定。比如Java,定义变量时候的 int a = 10; double b = 24.45;等待。动态类型语言:变量类型在运行阶段可以确定的。也就是常说的弱类型语言。比如node,比如php,直接定 const a = XXX ; 或者var ; 或者 let ;等等。在运行时才能确定具体的数据类型。动态类型语言限制不严格,容易上手,写的代码...原创 2020-01-29 22:38:14 · 244 阅读 · 0 评论 -
JVM中逃逸分析和标量替换和栈上分配和同步消除
最近也是疫情严重,呆在家里把JVM虚拟机内容慢慢又过一遍,把一些内容再做个总结加深下自己印象。逃逸分析:逃逸分析其实就是分析一个方法中创建出来的‘对象’的作用域是否限制于本方法内。单例模式就是一个典型的逃逸分析。翻译:假设你正在跑步机跑步(这是一个running方法),这时候饿了(有需要),让妈妈给你拿一碟小番茄(在另外一个方法里 new 小番茄 = 小番茄() );你把一碟都拿走了,这...原创 2020-01-27 12:06:13 · 922 阅读 · 0 评论 -
Java中的堆详解(一看就懂系列:用杂物房做比喻)
堆是什么?1: 堆是一块大内存,是启动JVM执行Java程序时自动分配的。2:堆的大小可以是默认动态分配,也可以根据自己需要指定设置。3:实例化的大对象和数组都在这里,对象类型的变量也会在这里完成初始化,静态变量之类的就在常量池(常量池在运行时会把变量放到运行时常量池,然后给栈里面的一个个栈帧去调用,栈内存里面存放着对象和变量和数组的引用,这里不多说栈的东西。)翻译:堆就是类似一个杂物...原创 2020-01-22 16:02:48 · 1346 阅读 · 0 评论 -
Java中的栈(JVM底层详解,看完不懂找我拿糖)
Java的底层其实就是JVM(Java虚拟机);对于这个底层的学习一直是比较困难的,看书和看视频呢,讲得都是非常底层的一些理论,甚至涉及到计算机组成原理内容更多;实话说上大学时候老师是根本不讲JVM的,简单粗暴讲Java怎么用,有什么特性。所以在工作后,为了更进一步的发展,对自己所用到的技术也要有更深一步的理解,这才慢慢接触和学习。虽然平时业务开发肯定是用不上的(除非有大神做的底层开发优化之类的...原创 2020-01-15 15:58:25 · 837 阅读 · 1 评论