![](https://img-blog.csdnimg.cn/20200902052837473.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM专栏
java虚拟机专栏
诗水人间
要想走的更远,就需要思考更深层次的问题。冷静、智慧、深沉是我所向往的
展开
-
运行时常量池的一道面试题(jdk8环境)
事先说明环境 在jdk8下,高版本的jdk可能找不到对应的Version类代码:public class TestDemo { @Test public void test01() { // String str1 = new StringBuilder("hello").append("World").toString(); System.out.println(str1.intern()); System.ou原创 2020-10-21 03:57:35 · 89236 阅读 · 4 评论 -
JVM参数设置大全
为了方便找到我这里专门做一篇博客,建议有用到的小伙伴 直接将原地址网站加书签元空间的设置:下面是起始大小设置为10M,最大的大小设置为20M-XX:MetaspaceSize=10M-XX:MaxMetaspaceSize=20M打印GC详细信息-XX:+PrintGCDetails简化的详细信息使用-XX:+PrintGC垃圾回收参数的设置设置串行收集器。-XX:+UseSerialGC并行收集器(吞吐量优先)设置为并行收集器。此配置仅对年轻代有效。年老代仍使用串行收集。原创 2020-11-29 00:30:00 · 9749 阅读 · 0 评论 -
那些你还不熟悉的---类的初始化和实例化的初始化过程
面试题:如下两个类的代码/*父类对象*/public class Father{ private int i = test(); private static int j = method(); static{ System.out.print("(1)"); } Father(){ System.out.print("(2)"); } { System.out.print("(3)"); } public int test(){ System.out.pr原创 2020-06-27 01:04:17 · 113985 阅读 · 1 评论 -
JVM指令集
跳转到class文件目录,使用javap -c StringTest.class -> p.txt通过命令将编译后的文件输出到p.txt文件栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈int类型入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈long类型入栈lconst_0 将long类型常量0压入栈lconst_1 将long类型常量1压入栈float类型入栈fconst_0 将float类型原创 2020-08-02 12:34:26 · 121116 阅读 · 0 评论 -
CPU占用过高,分析定位到哪一行代码存在bug
总的来说就是利用 jstack 命令打印一下堆栈中的信息而 jstack 需要线程id因此第一步是先分析一下系统中占用cpu过高的程序是哪一个进程,通过top命令可以查看到第一步找到cpu占用最高的进程id(定位进程)top如下输出,找到这个%CPU表示cpu占用率,默认是降序,因此先定位到进程id 也就是PID找到进程后,我们接着细致的找进程中的哪一个线程占用cpu过高第二步 定位到是那个java程序jps -l | grep 进程pid这行命令的作用是通过jps -l打印进程pi原创 2021-01-29 16:48:45 · 2023 阅读 · 1 评论 -
运行时常量池的再深入,从jvm的内存分配角度谈谈这道字符串常量池的面试题。
此前我写过另外一篇关于字符串常量池的面试题运行时常量池的一道面试题(jdk8环境)本篇博客的内容能证明我上一篇博客中的推论面试题原题:public class TestDemo { @Test public void test01() { String str1 = new StringBuilder("ja").append("va").toString(); String str2 = str1.intern(); Sys原创 2020-12-14 05:39:45 · 6188 阅读 · 5 评论 -
分享一个JVM的在线图,特别细致和全面,绝对是大神级别制作的jvm图,我们一起来参观一下吧
为了不侵犯大神的知识劳动产权,我这里直接引用原地址:https://processon.com/view/5c749debe4b0f9fba6921d15建议收藏这张图。做一个书签什么的原创 2020-12-10 17:04:05 · 16521 阅读 · 1 评论 -
java8以后字符串常量池的位置,以及元空间的探秘,使用VisualVM进行实战验证
在网上看了很多博客,解释也比较多,关于字符串常量池的具体位置难以分辨谁真谁假。 对于jdk8以后的版本有人说字符串常量池在元空间中,也有人说字符串常量池存在堆中。 到底谁说的对?他们的说法有依据吗? 今天让我们来一起探讨一下这个问题有人说字符串常量池在java堆中,可又有人说常量池存在元空间中。分享几篇知乎文章 关于jvm运行时数据区的模型:1、面试官 | JVM 为什么使用元空间替换了永久代?2、Java方法区与元空间为了解决这个问题,下面我们通过Idea、VisualVm原创 2020-12-08 03:56:29 · 31606 阅读 · 12 评论 -
强引用、软引用、弱引用、虚引用的区别和作用,以及例子
引用大佬的博客: Java:强引用,软引用,弱引用和虚引用建议直接看大佬的博客,我这里只做总结。总结强引用 相当于 Object obj=new Object()这种引用就是强引用,即使OOM也不会被垃圾回收器进行回收软引用 如果将要发生了OOM(内存不够用了)则会将对象自动回收弱引用 只要发生了gc()就会进行回收虚引用的对象虚引用 主要用来跟踪对象被垃圾回收的活动。虚引用必须和引用队列关联使用。案例:import java.lang.ref.*;public class WeakRe原创 2020-11-29 00:20:45 · 25797 阅读 · 0 评论 -
类的加载器的介绍 和 类的加载过程
java的3大加载器引导类加载器 BootStrapClassLoader扩展类加载器 ExtensionClassLoader应用程序类加载器 ApplicationClassLoader三大类加载器可以简单的理解为:BootStrapClassLoader加载的是JVM核心类的类库ExtensionClassLoader加载的是扩展类的类库ApplicationClassLoader加载我们自己写的java类类库类的加载器加载了哪些类库jdk1.8中BootStrapC原创 2020-09-24 21:41:01 · 90547 阅读 · 0 评论 -
JVM架构内存结构图
在线分享地址:JVM内存结构图原创 2020-09-14 03:40:54 · 89395 阅读 · 0 评论 -
Graal VM 未来可能的趋势
摘录《深入理解java虚拟机》----周志明----第三版的部分原文: 自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器,看名字就可以联想到它 是来自于前一节提到的Graal VM。Graal编译器是以C2编译器替代者的身份登场的。C2的历史已经非 常长了,可以追溯到Cliff Click大神读博士期间的作品,这个由C++写成的编译器尽管目前依然效果拔 群,但已经复杂到连Cliff Click本人都不愿意继续维护的程度。而Graal编译器本身就是由Java语言写 成,实现原创 2020-09-14 02:34:32 · 99461 阅读 · 0 评论 -
Microsoft JVM 以及 Taobao JVM 的介绍
Microsoft JVM微软为了在IE3浏览器中支持Java Applets,开发了Microsoft JVM。Microsoft JVM只能在windows平台下运行,但确实是当时windows平台上性能最好的java虚拟机。1997年,Sun指控微软侵犯商标成功,微软赔了Sun公司很多前,微软在windows XP SP3中抹除了其VM。现在windows安装的jdk都是HotSpot虚拟机摘录《深入理解java虚拟机》----周志明----第三版的部分原文: 在Java语言诞生的初期(1原创 2020-09-14 02:16:36 · 84048 阅读 · 0 评论 -
Apache Harmony的介绍
Apache Harmony由IBM和Intel联合开发的一款开源java,后IBM抨击Sun公司不开源java。IBM希望Apache Harmony成为java的规范,于是Sun公司开源了java并命名为OpenJDK。并且坚决不让Apache Harmony获得JCP认证,最终2011年Apache Harmony退役,IBM转而参与OpenJDK。Apache Harmony的java类库被Android SDK使用;摘录《深入理解java虚拟机》----周志明----第三版的部分原文:原创 2020-09-14 01:57:36 · 101639 阅读 · 0 评论 -
J9 VM的介绍
IBM的J9全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号J9J9的市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VMJ9是目前由影响力的三大商业虚拟机之一,2017年IBM发布了开源J9 VM,命名为OpenJ9,交给Eclipse基金会管理,也称Eclipse OpenJ9。摘录《深入理解java虚拟机》----周志明----第三版的部分原文: IBM J9虚拟机并不是IBM公司唯一的Java虚拟机,不过目前IBM原创 2020-09-14 01:43:38 · 81660 阅读 · 0 评论 -
JRockit VM的介绍
JRockit VM由BEA公司开发,是真正意义的世界上最快的java虚拟机。后BEA公司在2008年被Oracle收购。JRockit专注于服务端应用,JRockit内部不包含解释器实现,全部代码都靠及时编译器(JIT)编译后执行。Oracle收购了BEA后,想要整合JRockit到HotSpot虚拟机上。后由于两者架构相差很大,只是部分优秀内容被整合。后高斯林(java之父)辞职,就职于谷歌,研究人工智能和水下机器人。...原创 2020-09-14 01:35:38 · 89015 阅读 · 0 评论 -
HotSpot虚拟机的介绍
HotSpot虚拟机由Longview Technologies小公司设计,1997年,由Sun公司收购;2009年Sun被Oracle收购。jdk1.3时HotSpot VM成为了默认的java虚拟机。HotSpot是一款及时编译器执行引擎HotSpot虚拟机占据绝对的市场地位,从jdk1.3到现如今jdk14都是 Oracle JDK 和 OpenJDK中默认的虚拟机。面试中问到的GC也都是HotSpot虚拟机的GC机制摘录《深入理解java虚拟机》----周志明----第三版的部分原文:原创 2020-09-14 01:18:55 · 99513 阅读 · 0 评论 -
Exact VM的介绍
Exact VM全称是Exact Memory Management Virtual Machine诞生于jdk1.2,主要目的是解决解释型引擎执行效率低的问题,也是现代高性能虚拟机的雏形。只在Solaris平台上使用,还没在其它平台上应用就被HotSpot虚拟机替换。摘录《深入理解java虚拟机》----周志明----第三版的部分原文: Exact VM因它使用准确式内存管理(Exact Memory Management,也可以叫Non-Conservative/Accurate Memory原创 2020-09-13 23:23:31 · 91803 阅读 · 0 评论 -
SUN Classic VM的介绍
SUN Classic VM是一款解释型的java字节码执行引擎java虚拟机分为两类执行引擎,①解释型、②及时编译(Just-In-Time) 执行引擎两者的区别是解释型是一行一行执行代码,类似于javascript、python这类解释型的编程语言。及时编译 是将字节码中的热点代码编译成机器码,并且将机器码缓存到方法区的代码缓存区。Sun Classic VM诞生于java1.0(1996年),是世界上第一款商用Java虚拟机,在jdk1.4(2002年)后被完全淘汰!Sun Classic原创 2020-09-13 23:05:06 · 96278 阅读 · 0 评论 -
JVM的生命周期
①虚拟机的启动–>②虚拟机的执行–>③虚拟机的退出虚拟机的启动java虚拟机的启动时通过引导类加载器(Bootstrap ClassLoader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的。虚拟机的执行执行一个java应用程序的时候就会启动一个java虚拟机进程。程序开始则虚拟机的执行就开始,程序结束虚拟机的执行就结束虚拟机的退出虚拟机的退出由以下几种情况程序正常执行结束执行过程中抛异常或错误操作系统执行出错执行Runtime类或原创 2020-09-13 22:46:00 · 119746 阅读 · 0 评论 -
双亲委派机制----类的加载过程以及沙箱安全机制
双亲委派机制当加载一个类的时候会经过双亲委派机制,一层一层向上询问类是否已经加载了java中存在三种类加载器C/C++库编写的引导类加载器BootStrapClassLoader扩展类加载器ExtensionClassLoader应用程序类加载器ApplicationClassLoader以及自定义的ClassLoader当程序中需要加载一个类时,首先会向上传递是否加载了这时就会传递给ExtensionClassLoader,ExtensionClassLoader有父类就会接着传递给父类原创 2020-08-19 02:52:57 · 88105 阅读 · 0 评论 -
3种方式获取类加载器
方式一、获取当前类的ClassLoader直接 类名.class.getClassLoader();或者实例对象.getClass().getClassLoader();例如:String.class.getClassLoader();或:new String().getClass().getClassLoader()方式二、获取当前线程上下文的ClassLoader例如:Thread.currentThread().getContextClassLoader();方式三、获取系统的Class原创 2020-08-19 01:55:36 · 128509 阅读 · 0 评论 -
JVM专题20道面试题和答案
一、内存模型以及分区,需要详细到每个区放什么。JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new:方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字 节码)等数据堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要 在堆上分配栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操 作数原创 2020-08-02 13:29:57 · 117932 阅读 · 0 评论 -
VisualVM的配置和使用
下载VisualVM:官网下载页面解压缩后进入到etc目录修改visualvm.conf配置文件需要注意:我当时使用的visualVM是2.0.3这个版本的只支持jdk8以前的,我本地配置的环境变量是jdk14,但是又不想配置jdk8作为环境变量,直接修改配置文件,将这里的目录改成jdk8的javahome即可。然后运行VisualVM...原创 2020-08-01 12:20:31 · 113623 阅读 · 4 评论 -
JVM的生命周期
虚拟机的启动java虚拟机的启动是通过引导类加载器创建一个初始类来完成,这个类由java虚拟机的具体实现指定的。虚拟机的执行一个运行中的java虚拟机有一个清晰的任务:执行java程序程序开始执行时虚拟机才运行,程序结束时就停止执行java程序的时候,真真正正在执行的是一个叫做java虚拟机的进程虚拟机的退出程序正常执行结束 程序遇到异常或错误 操作系统出...原创 2020-02-26 23:33:30 · 141968 阅读 · 0 评论 -
Hotspot虚拟机的两种架构模型
市面上的java虚拟机有很多种,整体来说分两种架构特点:栈、寄存器一、基于栈架构的特点(市面上常见的java虚拟机大多的架构方式)设计实现更简单 不需要考虑寄存器分配问题(使用零地址指令方式分配) 指令集更小,编译容易小 不需要硬件支持,可移植性更好,更容易实现跨平台二、基于寄存器架构的特点(安卓的虚拟机就是基于寄存器的方式)典型的应用是x86的二进制指令集 性能优秀,执行指...原创 2020-02-26 22:51:06 · 138123 阅读 · 0 评论 -
java 的发展历史
java语言的诞生1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划最初的目标 是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划 的产品就是Java语言的前身:Oak(得名于James Gosling办公室外的一棵橡树)。Oak当时在消费品市 场上并不算成功,但随着1995年互联网潮流的兴起,O...翻译 2020-02-26 12:23:48 · 130610 阅读 · 0 评论