
JVM
文章平均质量分 72
程序猫大刚
我是一名软件工程师,为技术奋斗。<br>我的个人博客地址:http://mg.meiflower.top/mb
展开
-
熟悉JVM内存区域
本地方法栈和虚拟机栈作用类似,只不过一个服务于本地方法(native的c实现的),一个是Java方法(字节码方法)。Java是以方法做为最基本的执行单元,而栈帧则是虚拟机进行方法调用和执行的数据结构,也是虚拟机栈中的元素。每一个栈帧都包含局部变量表、操作数栈、动态连接、返回地址和一些其他附加信息。在HotSpot虚拟机中,直接将虚拟机栈和本地方法栈合二为一。取代,而且不再在在虚拟机内存中,而是使用的本地内存。而JDK1.8和JDK1.7比,主要是将。原创 2022-09-27 23:34:14 · 340 阅读 · 0 评论 -
HotSpot垃圾算法实现之并发可达性分析
想要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,等并发扫描完成后,再将这些记录的引用以灰色对象为根,重新扫描一次。想要破坏的是第一个条件,当插入了黑色对象到白色对象的引用时,就将这个新插入的引用记录下来,等并发扫描完成后,再将这些记录的引用以黑色对象为根,重新扫描一次。根可达算法在理论上,需要冻结全部的用户线程运行。在根节点枚举步骤中,由于GC Roots相比整个Java堆中全部对象毕竟是极少数,且在OopMap优化下,带来的停顿时间非常短暂且相等固定。原创 2022-09-26 23:10:02 · 319 阅读 · 0 评论 -
HotSpot垃圾算法实现之记忆集与卡表和写屏障
一个卡页的内存中通用有多个对象,但是只有卡页中有一个对象的字段存在着跨代指针,则将该卡页对应的卡表索引元素值标识为1(称为变脏),没有则标识为0。当部分区域进行垃圾收集时,如果非收集区域的对象跨区引用了收集区域的对象(收集区域的对象A可能被非收集区域的对象静态字段B引用,这样对象A应加入GC Roots集合,防止被错误清理),虽然可以笼统的将其他所有区域都加入到GC Roots的扫描范围,可如此势必会有额外的性能消耗。赋值前的写屏障叫写前屏障,赋值后的写屏障叫写后屏障。(这里的写屏障和内存屏障无关)原创 2022-09-01 18:56:58 · 350 阅读 · 0 评论 -
HotSpot垃圾算法实现之枚举根节点和安全点安全区域
在根可达性分析算法中,从GC Roots集合中找引用链是虚拟机高效实现的第一个例子。原创 2022-09-01 18:45:10 · 347 阅读 · 1 评论 -
Java类加载器
Java虚拟机通过一个类的全限定名来获取类的二进制字节流的这个动作,放到虚拟机外部实现,让应用程序自己决定如何获取所需的类。实现这个动作的代码叫做类加载器。原创 2022-09-01 18:27:51 · 475 阅读 · 0 评论 -
熟悉Java类文件class结构
Java基于Class文件作为存储格式,不同平台对应虚拟机实现的方式让Java具备跨平台的特性。因此我们有必要更深入学习Class字节码文件的结构。原创 2022-09-01 00:41:05 · 249 阅读 · 0 评论 -
熟悉JVM字节码指令
Java虚拟机的指令由一个字节长度(256个操作码)的、代表着特定操作含义的数字(操作码,Opcode)和跟随其后的零至多个代表其操作需要的参数(操作数,Operand)构成。由于Java虚拟机采用面向操作数栈的架构,所以大部分指令都只有一个操作码,操作数都是放到操作数栈中。如果不考虑异常,则简单的指令执行模型的伪代码如下:do {自动计算PC寄存器的值加1;根据PC寄存器指示的位置,从字节码流中取出操作码;if (字节码存在操作数) {从字节码流中取出操作数;}...原创 2022-09-01 00:26:56 · 234 阅读 · 0 评论 -
Mac10.15.7上编译OpenJDK8u
进入到目录(因机器而已):/Users/mango/git/openjdk8u/build/macosx-x86_64-normal-server-release/images/j2sdk-image/bin,后执行。在编译过程中,可能会遇到各种各样的问题,这里就不标出来了。(因为不太懂C,要怎么解决也都是查资料尝试解决的。执行make images命令,编译过程耗时比较久,请耐心等待。如果有代理请设置代理,不然可能会超时或者慢。下,在IDEA中配置使用。该过程很慢,请耐心等待。下的软件包copy到。原创 2022-08-22 22:54:47 · 4676 阅读 · 0 评论 -
垃圾收集算法
部分收集(Partial GC): 不是完整收集Java堆的收集。新生代收集(Minor GC/Young GC):只是新生代的收集。老年代收集(Major GC/Old GC):只是老年代的收集。目前只有CMS收集器会有单独收集老年代的行为。混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。原创 2022-08-20 10:29:39 · 213 阅读 · 0 评论 -
Java虚拟机相关工具
本文主要是为了介绍虚拟机相关的工具,包括故障处理、性能监控和一些其他工具。原创 2022-08-20 10:07:25 · 1383 阅读 · 0 评论 -
IDEA的启动速度优化
如果发现自己的IDE很慢,或者卡顿,那么就对它来一次调优吧。本人使用的是IDEA,如果是Eclipse的同学,可查找对应相关资料,本文仅供参考。原创 2022-08-19 10:37:04 · 977 阅读 · 0 评论 -
Java发展历史
Java发展历史及组成部分原创 2022-08-12 10:50:46 · 887 阅读 · 0 评论 -
垃圾判断算法与4大引用
在熟悉Java内存区域[1]文中,指出了JVM运行时数据区有堆、方法区、虚拟机栈、本地方法栈和程序计数器5个部分,后3个部分都是线程私有的,其中的数据会跟随线程死亡自动回收,所以不需要垃圾收集。而堆和方法区是线程共享的,故垃圾收集主要关注这2个部分。给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;任何时刻计数器值为0的对象就是不可能再被使用的,也就是垃圾。的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链。没有任何引用链相连,则证明此对象时不可用的。RC Roots对象。..原创 2022-08-10 22:26:54 · 138 阅读 · 0 评论 -
如何计算Java对象的大小
对象大小 = 对象头字节 + 实例数据字节 + 填充字节。原创 2022-08-10 11:21:11 · 1526 阅读 · 0 评论 -
熟悉HotSpot中的对象
使用句柄方式访问,优点是对象变化时栈中的reference的值不用改变,存储的是稳定的句柄地址;类型指针Klass存储该对象的类对象的内存地址,可以通过该指针知道对象是属于哪个类。对象引用中存储的是对象实例数据指针,再通过对象头里的klass指针找到对象类型数据。对象的存储空间是在堆中分配的,但是这个对象的引用(存的是地址)却是在栈中分配的。对象引用内存储的是指向句柄地址,句柄对象中包含对象实例数据指针和类型数据指针。目前对象的访问方式有句柄访问和直接指针访问方式。至此,一个可用的对象才算是完全创建出来。.原创 2022-08-09 18:03:39 · 359 阅读 · 0 评论 -
Java的线程实现
当我们追踪Java线程的实现时,可以发现Thread类的start方法最后会运行一个start0方法,而这个方法是native的,也就是交由JDK来实现的(JDK会屏蔽调底层操作系统的差异,提供给Java开发者一套通用的线程接口)线程的主要实现方式有3种(线程模型),分别是使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。用户线程的创建、同步、销毁及调度完全是在用户态中完成,不需要切换到内核态,因此操作是快速且低消耗的。而要搞清楚这个问题的答案,首页我们得对线程的实现有一定的了解。...原创 2022-07-20 22:22:40 · 300 阅读 · 0 评论 -
深入类加载机制
文件格式验证,元数据验证(语义校验),字节码验证(逻辑校验),符号引用校验为类变量(static的)分配内存并赋初始值。主要针对:测试:卸载类卸载需要满足如下条件:(自定义类加载器加载的类才会被卸载)...原创 2022-07-08 12:24:51 · 154 阅读 · 0 评论