自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 并发编程夯实之路————共享模型的管理

但在以上的基础上,为 ThreadSafe 类添加子类,子类覆盖 method2 或 method3 方法,子类重写方法,重启一个线程调用局部变量引用的对象,就会有问题。4.这中间即使 t1 的 cpu 时间片不幸用完,被踢出了门外(不要错误理解为锁住了对象就能一直执行下去哦),这时门还是锁住的,t1 仍拿着钥匙,t2 线程还在阻塞状态进不来,只有下次轮到 t1 自己再次获得时间片时才能开门进入。1.线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。

2024-04-14 14:18:45 633 1

原创 并发编程夯实之路————Java线程

2.RUNNABLE 当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)1.打断 sleep,wait,join 的线程 这几个方法都会让线程进入阻塞状态(打断阻塞状态的线程)之后会抛出异常以及打断标记(清空打断标记输出false),如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】

2024-04-14 13:53:52 730 1

原创 并发编程夯实之路————进程与线程

操作系统中有一个组件叫做任务调度器,将 cpu 的时间片分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。多线程可以让方法执行变为异步,比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这5秒 cpu 什么都做不了,其它代码都得暂停。有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。

2024-04-14 13:48:52 228 1

原创 虚拟机夯实之路————Class类文件的结构

常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它还是在Class文件中第一个出现的表类型数据项目。无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式,这时候称这一系列连续的某一类型的数据为某一类型的“集合”。由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值。

2024-04-03 18:37:29 776 1

原创 虚拟机夯实之路————内存分配和回收策略

如果允许,那会继续检查⽼年代最⼤可⽤的连续空间是否⼤于历次晋升到⽼年代对象的平均⼤⼩,如果⼤于,将尝试进⾏⼀次Minor GC,尽管这次 Minor GC是有⻛险的;⽼年代要进⾏这样的担保,前提是⽼年代本身还有容纳这些对象的剩余空间,但⼀共有多少对象会在这次回收中活下来在实际完成内存回收之前是⽆法明确知道的,所以只能取之前每⼀次回收晋升到⽼年代对象容量的平均⼤⼩作为经验值,与⽼年代的剩余空间进⾏⽐较,决定是否进⾏Full GC来让⽼年代腾 出更多空间。⼤多数情况下,对象在新⽣代Eden区中分配。

2024-04-03 18:31:41 252 1

原创 虚拟机夯实之路————选择适合的垃圾收集器

日志级别从低到高,共有Trace,Debug,Info,Warning,Error,Off六种级别,日志级别决定了输出信息的详细程度,默认级别为Info,HotSpot的日志规则与Log4j、SLF4j这类Java日志框架大体上是一致的。一个垃圾收集器除了垃圾收集这个本职工作之外,它还要负责堆的管理与布局、对象的分配、与解释器的协作、与编译器的协作、与监控子系统协作等职责,其中至少堆的管理和对象的分配这部分功能是Java虚拟机能够正常运作的必要支持,是一个最小化功能的垃圾收集器也必须实现的内容。

2024-04-03 18:30:13 541 1

原创 虚拟机夯实之路————低延迟垃圾收集器

尽管通过对象头上的Brooks Pointer来保证并发时 原对象与复制对象的访问一致性,这件事情只从原理上看是不复杂的,但是“对象访问”这四个字的分量是非常重的,对于一门面向对象的编程语言来说,对象的读取、写入,对象的比较,为对象哈希值 计算,用对象加锁等,这些操作都属于对象访问的范畴,它们在代码中比比皆是,要覆盖全部对象访问操作,Shenandoah不得不同时设置读、写屏障去拦截。的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志位。

2024-04-03 18:24:37 896 1

原创 虚拟机夯实之路————经典垃圾收集器

这个收集器是直到JDK 6时才开始提供的,在此之前,新⽣代的Parallel Scavenge收集器⼀直处于相当尴尬的状态,原因是如果新⽣代选择了Parallel Scavenge 收集器,⽼年代除了Serial Old收集器以外别⽆选择,直到Parallel Old 收集器出现后,“吞吐量优先”收集器终于有了⽐较名副其实的搭配组合,在注重吞吐量或 者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器 这个组合。

2024-04-03 17:18:52 556 1

原创 虚拟机夯实之路————垃圾收集内算法细节实现

写屏障可以看作在虚拟机层⾯对 “引⽤类型字段赋值”这个动作的AOP切⾯,在引⽤对象赋值时会产⽣⼀个环形通知,供程序执⾏额外的动作,也就是说赋值的前后都在写屏障的覆盖范畴内。一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1,称为这个元素变脏(Dirty),没有则标识为0。,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外存储空间,这样垃圾收集伴随而来的空间成本就会变得无法忍受的高昂。

2024-04-03 17:08:01 892 1

原创 虚拟机夯实之路————垃圾回收算法

内存的访问是用户程序最频繁的操作,甚至都没有之一,假如在这个环节上增加了额外的负担,势必会直接影响应用程序的吞吐量。但假如进行一次仅局限于新生代区域的收集,但新生代对象完全有可能被老年代所引用,为了找出新生代的存活对象,不得不在固定GC Roots外,再额外遍历整个老年代中的所有对象来确保可达性分析结果的正确性。算法分为“标记”和“清除”两个阶段:1)首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,2)也可以反过来,标记存活的对象,统一回收所有未被标记的对象。

2024-04-03 17:04:06 673 1

原创 虚拟机夯实之路————判断对象是否死亡

()方法是对象逃脱死亡的最后一次机会,之后收集器将对F-Queue中的对象进行第二次小规模标记,如果对象要在finalize()中成功拯救自己,要重新与引用链上的任何一个对象建立关联,例如把自己(this关键字)赋值给某个类变量或者对象的成员变量,那再第二次标记时它将被移除“即将回收“的集合。这样做的原因时,如果某个对象的finalize()方法执行的很慢,或者更极端发生了死循环,将很有可能导致F-Queue队列中的其它对象永久处于等待,或者导致整个内存回收子系统的崩溃。引用失效,计数器就减一;

2024-04-03 17:01:03 535 1

原创 虚拟机夯实之路————OOM的异常

(Unsafe类的getUnsafe()方法指定只有引导类加载器才会返回实例,体现了设计者希望只有虚拟机标准类库里面的类才能使用Unsafe的功能,在JDK 10时才将Unsafe 的部分功能通过VarHandle开放给外部使用)因为虽然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配就会在代码里手动抛出溢出异常,真正申请分配内存的方法是Unsafe::allocateMemory()。虚拟机栈和本地方法栈溢出。

2024-03-31 20:29:40 376 1

原创 虚拟机夯实之路————虚拟机对象解密

接下来实例数据部分是对象真正存储的有效信息,即我们程序代码真正存储的有效信息,,无论是从父类继承下来的,还是子类中定义的字段都必须记录起来。2.直接指针:Java堆中对象的内存布局要考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只访问对象本身的话,就不需要多一次间接访问的开销。1.句柄访问:Java堆可能会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息。主流方式有使用句柄和直接指针两种。

2024-03-31 20:28:24 432 1

原创 虚拟机夯实之路————运行时数据区域

直接内存的分配不会受到Java堆大小的限制,但受到本机总内存大小和处理器寻址空间的限制,配置时会根据实际内存去设置-Xmx等参数信息,但若忽略内存,使各内存区域总和大于物理内存限制,也会导致动态扩展时出现OOM。方法区的一部分,class文件除了有类的版本、字段、方法、接口等描述信息外,还有常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容在类加载后存放在方法区的运行常量池中。与虚拟机栈相似,虚拟机栈为虚拟机执行Java方法,本地方法栈为虚拟机使用到的本地(Native)方法服务。

2024-03-31 20:26:33 750 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除