
深入理解java虚拟机v3
云川之下
这个作者很懒,什么都没留下…
展开
-
【深入理解java虚拟机v3 】 4.2.6 jstack:Java堆栈跟踪工具(查看所有的线程信息&占cpu最高的进程和线程)
文章目录1. 概述2. 例子1. 概述Java堆栈跟踪工具jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些原创 2020-12-07 22:45:39 · 499 阅读 · 0 评论 -
【深入理解java虚拟机v3 】 4.2.3 jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 6或以上版本的话,使用java -XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内翻译 2020-12-04 23:29:00 · 126 阅读 · 0 评论 -
【深入理解java虚拟机v3 】3.4.4 记忆集与卡表
文章目录1. 什么是卡表2. 卡表的维护1. 什么是卡表在新生代做GCRoots可达性扫描过程中可能会碰到跨代引用的对象,这种如果又去对整个老年代再去扫描效率太低了。为此,在新生代可以引入记录集(Remember Set)的数据结构(记录从非收集区到收集区的指针集合),避免把整个老年代加入GCRoots扫描范围。事实上并不只是新生代、 老年代之间才有跨代引用的问题, 所有涉及部分区域收集(Partial GC) 行为的垃圾收集器, 典型的如G1、 ZGC和Shenandoah收集器, 都会面临相同的问原创 2020-12-04 12:58:50 · 520 阅读 · 0 评论 -
【深入理解java虚拟机v3 6.3.3 访问标志
主要想说明访问标志需要经过位运算package org.fenixsoft.clazz;public class TestClass { private int m; public int inc() { return m + 1; }}TestClass是一个普通Java类,不是接口、枚举、注解或者模块,被public关键字修饰但没有被声明为final和abstract,并且它使用了JDK 1.2之后的编译器进行编译,因此它的ACC_PUBLIC、ACC_SUPER标志应当为真,而原创 2020-11-22 00:28:25 · 143 阅读 · 0 评论 -
【深入理解java虚拟机v3 】3.2.4 finalize()方法
什么是finalize()方法当一个对象重写了finalize(),在垃圾回收时,会先调用一次该方法。finalize()方法最终判定对象是否存活即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记过程。标记的前提是对象在进行可达性分析后发现没有与GC Roots相连接的引用链。第一次标记并进行一次筛选。筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize方法,对象将直接被回原创 2020-11-21 21:08:34 · 185 阅读 · 0 评论 -
【深入理解java虚拟机v3 】11.4.3 逃逸分析
文章目录1. 什么是逃逸分析2. 作用1. 什么是逃逸分析逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。逃逸分析的基本原理是:分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;从不逃逸、方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。简单来说,如果对象的生命周期仅在方法内部,方法结束,该变量就原创 2020-11-21 15:46:51 · 278 阅读 · 0 评论 -
【深入理解java虚拟机v3 】 8.2.3 动态连接
每个栈帧都包含一个指向运行时常量池[1]中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。通过第6章的讲解,我们知道Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池里指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析。另外一部分将在每一次运行期间都转化为直接引用,这部分就称为动态连接。符合引用最终都要转为直接引用,但是时机不一样,有的类加载阶段或原创 2020-11-19 17:05:28 · 135 阅读 · 0 评论 -
【深入理解java虚拟机v3 】 2.2.1 程序计数器
文章目录什么是程序计数器?什么是程序计数器?程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 --转载 2020-11-18 17:17:26 · 110 阅读 · 0 评论 -
【OSGI】OSGI HelloWorld调试过程中乱码问题
创建hello world的例子可以参考clipse编写第一个osgi bundle的小demo,同时导出osgi化的bundle包括配置运行时依赖的5个Target Platform:但是初次运行时报错:乱码大概率是中文显示问题,把编码格式由UTF-8改为GBK试试:再次执行,发现错误能正常显示了:根据提示信息,出现#-Xverify:none,猜测是带了一些错误的系统参数,#号是非法字符,去掉相关的信息:一切ok:...原创 2020-10-22 21:13:41 · 294 阅读 · 0 评论 -
【jvm jdk】类加载器5 自定义符合双亲委派规则的ClassLoader
参考自定义ClassLoader原创 2020-10-19 21:48:31 · 200 阅读 · 0 评论 -
【深入理解java虚拟机v3】 《7.4 类加载器》代码清单7-8 不同的类加载器对instanceof关键字运算的结果的影响
原文例子package org.fenixsoft.classloading;import java.io.IOException;import java.io.InputStream;public class ClassLoaderTest { public static void main(String[] args) throws Exception { ClassLoader myLoader = new ClassLoader() { @原创 2020-10-19 16:33:13 · 255 阅读 · 0 评论 -
【深入理解java虚拟机v3】双亲委派模型 代码清单7-9 ClassLoader.getClassLoader()方法的代码片段
原文代码片段代码清单7-9 ClassLoader.getClassLoader()方法的代码片段//JDK 1.8public final class Class<T> { /** * Returns the class loader for the class. Some implementations may use * null to represent the bootstrap class loader. This method will原创 2020-10-14 18:44:53 · 147 阅读 · 0 评论 -
【mysql jdbc】SPI介绍及实例分析
文章目录背景介绍什么是SPI机制使用场景实例ServiceLoader源码解析小结背景介绍提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface。而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现它的有点无处不在的感觉。比如我们经常使用的spring框架,其spring-web包下就在使用该机制:还有我们每个项目都离不开的日志框架log4j和数据库驱动框架中也同样的使用着SPI机制:mysql驱动同样也应用该机转载 2020-10-13 16:31:16 · 1330 阅读 · 0 评论 -
【jvm jdk】类加载器4 线程上下文类加载器 & DriverManager& Driver& mysql驱动详解(SPI)
文章目录1. 简介2. 用法3. 上下文类加载器的作用1. 简介线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器。原创 2020-10-13 10:39:10 · 844 阅读 · 0 评论 -
【深入理解java虚拟机v3】《7.4.1 类与类加载器》解读 & jvm提供的类加载器全部类型
应用程序类加载器(Application Class Loader):这个类加载器由sun.misc.Launcher$AppClassLoader来实现。由于应用程序类加载器是ClassLoader类中的getSystem-ClassLoader()方法的返回值,所以有些场合中也称它为“系统类加载器”。它负责加载用户类路径(ClassPath)上所有的类库,开发者同样可以直接在代码中使用这个类加载器。如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。...原创 2020-10-12 19:03:04 · 172 阅读 · 0 评论 -
【jvm jdk】Class文件中的常量池详解(上)
文章目录NO1.常量池在class文件的什么位置?NO2.常量池的里面是怎么组织的?NO3.常量池项 (cp_info) 的结构是什么?NO4.常量池能够表示那些信息?NO5. int和float数据类型的常量在常量池中是怎样表示和存储的?NO6. long和 double数据类型的常量在常量池中是怎样表示和存储的?NO7. String类型的字符串常量在常量池中是怎样表示和存储的?NO8. 类文件中定义的类名和类中使用到的类在常量池中是怎样被组织和存储的?NO1.常量池在class文件的什么位置?在c转载 2020-09-29 20:56:12 · 375 阅读 · 0 评论 -
【深入理解java虚拟机v3】代码清单4-9 死锁代码样例
文章目录简介例子简介目的是介绍Jconsole查看死锁线程的状态例子public class ThreadDeadLockTestCase_2 { /** * 线程死锁等待演示 */ static class SynAddRunnalbe implements Runnable { int a, b; public SynAddRunnalbe(int a, int b) { this.a = a; this.b = b; } @Override p翻译 2020-09-23 22:54:20 · 122 阅读 · 0 评论 -
【深入理解java虚拟机v3】代码清单4-8 线程等待演示代码
import java.io.BufferedReader;import java.io.InputStreamReader;/** * @author zzm */public class ThreadDeadLockTestCase_1 { /** * 线程死循环演示 */ public static void createBusyThread() { Thread thread = new Thread(new Runnable() {翻译 2020-09-21 00:17:31 · 222 阅读 · 0 评论 -
《深入理解java虚拟机v3》 3.8.5 空间分配担保 代码清单3-11
在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。如果不成立,则虚拟机会先查看-XX:HandlePromotionFailure参数的设置值是否允许担保失败(Handle Promotion Failure);如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者-XX:Ha翻译 2020-09-19 01:06:45 · 362 阅读 · 0 评论 -
《深入理解java虚拟机v3》3.8.4动态对象年龄判定 > 代码清单3-10
为了能更好地适应不同程序的内存状况,HotSpot虚拟机并不是永远要求对象的年龄必须达到-XX:MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄。执行代码清单3-10中的testTenuringThreshold2()方法,并将设置-XX:MaxTenuring-Threshold=15,发现运行结翻译 2020-09-18 23:33:29 · 307 阅读 · 0 评论 -
《深入理解java虚拟机v3》长期存活的对象将进入老年代 > 代码清单3-9
文章目录1. 概述2. 例子2.1 以`-XX:MaxTenuringThreshold=1`参数来运行1. 概述HotSpot虚拟机中多数收集器都采用了分代收集来管理堆内存,那内存回收时就必须能决策哪些存活对象应当放在新生代,哪些存活对象放在老年代中。为做到这点,虚拟机给每个对象定义了一个对象年龄(Age)计数器,存储在对象头中(详见第2章)。对象通常在Eden区里诞生,如果经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,该对象会被移动到Survivor空间中,并且将其对象年翻译 2020-09-18 22:59:34 · 640 阅读 · 2 评论 -
《深入理解java虚拟机v3》大对象直接进入老年代 > 代码清单3-8
大对象就是指需要大量连续内存空间的Java对象,最典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组,本节例子中的byte[]数组就是典型的大对象。大对象对虚拟机的内存分配来说就是一个不折不扣的坏消息,比遇到一个大对象更加坏的消息就是遇到一群“朝生夕灭”的“短命大对象”,我们写程序的时候应注意避免。在Java虚拟机中要避免大对象的原因是,在分配空间时,它容易导致内存明明还有不少空间时就提前触发垃圾收集,以获取足够的连续空间才能安置好它们,而当复制对象时,大对象就意味着高额的内存复制开销。Hot翻译 2020-09-17 23:21:22 · 658 阅读 · 0 评论 -
《深入理解java虚拟机v3》对象优先在Eden分配 > 代码单3-7 新生代Minor GC
对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前的内存各区域分配情况。在代码清单3-7的testAllocation()方法中,尝试分配三个2MB大小和一个4MB大小的对象,在运行时通过-Xms20M、-Xmx20M、-Xmn10M这三个参数限制了Java堆翻译 2020-09-16 23:18:57 · 361 阅读 · 3 评论 -
《深入理解java虚拟机v3》Java 关于强引用,软引用,弱引用和虚引用的区别与用法
参考 为什么尽量不要使用Executors创建线程池转载 2020-09-16 20:23:50 · 447 阅读 · 2 评论 -
《深入理解java虚拟机v3》代码清单3-2 一次对象自我拯救的演示
/** * 此代码演示了两点: 1.对象可以在被GC时自我拯救。 2.这种自救的机会只有一次,因为一个对象的finalize()方法最多只会被系统自动调用一次 * * @author zzm */public class FinalizeEscapeGC { public static FinalizeEscapeGC SAVE_HOOK = null; public void isAlive() { System.out.println("yes, i am.翻译 2020-09-14 20:42:36 · 145 阅读 · 0 评论 -
《深入理解java虚拟机v3》代码清单2-8 String.intern()返回引用的测试 释疑
文章目录二、解释答案验证一、背景《深入理解java虚拟机》第二版 57页对String.intern()返回引用的测试代码如下:第三版是63页public class RuntimeConstantPoolOOM_2 { public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.pr转载 2020-09-10 16:02:02 · 196 阅读 · 0 评论 -
【深入理解java虚拟机v3】代码清单2-6 创建线程,导致内存溢出异常
测试环境JDK1.8给每个栈分配的内存越大,反而越容易出现OOM异常原因:操作系统给每个进程分配的内存是有限制的,比如32位windows的单个进程的最大内存为2GB。HotSpot虚拟机提供了参数可以控制java堆和方法区这两部分的最大值,剩余的内存即为2GB减去最大堆容量,再减去最大方法区容量,程序计数器耗内存很少,可以忽略掉,如果把直接内存和虚拟机进程自身消耗的内存也去掉的话,剩余的内存就由虚拟机栈和本地方法栈来分配了。虚拟机栈和本地方法栈内存=2G-最大堆容量-最大方法区容量-程序计数器-直接原创 2020-09-10 15:16:04 · 171 阅读 · 0 评论 -
【深入理解java虚拟机v3】代码清单2-4 、2-5虚拟机栈和本地方法栈测试
-Xss 限制虚拟机栈的大小-Xoss 限制本地方法栈大小由于HotSpot虚拟机不区分虚拟机栈和本地方法栈,对于HotSpot来说,-Xoss参数虽然存在,但是没有实际效果。虚拟机栈深度报错代码清单2-4:注意设置-Xss128k,限定了栈的上限,因此很快就报错/** * VM Args:-Xss128k * * @author zzm */public class JavaVMStackSOF_1 { private int stackLength = 1;原创 2020-09-10 15:15:42 · 218 阅读 · 0 评论 -
【深入理解java虚拟机v3】代码清单2-3 java堆内存溢出异常测试
import java.util.ArrayList;import java.util.List;/** * Vm args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * */public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject>翻译 2020-09-19 01:07:59 · 121 阅读 · 0 评论