随笔分类 -  JVM 探究

摘要:转自: https://www.cnblogs.com/myshare/p/16832627.html 一、前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。同时 阅读全文
posted @ 2023-01-02 23:42 雪山上的蒲公英 阅读(165) 评论(0) 推荐(0) 编辑
摘要:OutOfMemoryError: unable to create new native thread,字面含义,为在应用程序无法创建新线程,导致产生OOM,一般其产生的原因为应用程序层面系统内存耗尽,无法为新线程分配内存,当根据这个方向排查时,可能通过JVM参数的调整来进行定位修复;当然,另一方 阅读全文
posted @ 2022-12-30 23:54 雪山上的蒲公英 阅读(1645) 评论(0) 推荐(0) 编辑
摘要:serial old是一种垃圾回收器 serial old其实表示的是一种说法,老年代单线程回收。在不同的垃圾回收器中实现各部相同,现在有以下几种实现g1MarkSweep,psMarkSweep,genMarkSweep。 parallel gc日志里的老年代名称有时候会变 其实是老年代回收器不一 阅读全文
posted @ 2020-12-07 19:21 雪山上的蒲公英 阅读(167) 评论(0) 推荐(0) 编辑
摘要:《深入理解Java虚拟机》中有如上的一段描述,讲的是动态对象年龄判定,避免-XX:MaxTenuringThreshold 设置过大导致大量对象无法晋升。 但是存在一个问题,如果说非得相同年龄所有对象大小总和大于Survivor空间的一半才能晋升,按照如下场景: MaxTenuringThresho 阅读全文
posted @ 2020-10-28 11:06 雪山上的蒲公英 阅读(2818) 评论(4) 推荐(4) 编辑
摘要:转自:https://www.jianshu.com/p/8a58d8335270 1. 并发编程领域的关键问题 1.1 线程之间的通信 线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间 阅读全文
posted @ 2020-07-28 13:38 雪山上的蒲公英 阅读(298) 评论(0) 推荐(0) 编辑
摘要:volatile是Java虚拟机提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级。 volatile具有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1. JMM(Java 阅读全文
posted @ 2020-07-27 01:14 雪山上的蒲公英 阅读(711) 评论(0) 推荐(0) 编辑
摘要:实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。基于安全方面的考虑,Java虚拟机规范要求在Class文件中使用许多强制性的语法和结构化约束,但任一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。作为一个通用的、机器无关的执行平台,任何其他语言的实现者都可以将Java虚拟机作为语言的产品交付媒介。 阅读全文
posted @ 2019-12-14 18:41 雪山上的蒲公英 阅读(213) 评论(0) 推荐(0) 编辑
摘要:虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 1. 类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不 阅读全文
posted @ 2019-12-10 14:10 雪山上的蒲公英 阅读(368) 评论(0) 推荐(1) 编辑
摘要:1. 类加载是什么 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略 阅读全文
posted @ 2019-11-18 01:49 雪山上的蒲公英 阅读(242) 评论(0) 推荐(0) 编辑
摘要:1. 垃圾收集算法 1.1 标记清除(Mark-Sweep)算法 标记—清除算法是第一种使用和比较完善的垃圾回收算法,后续的收集算法都是基于其设计思路并对其不足进行改进而得到的。 该算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,其标记的过程就是判断对象有效性,执行可达性分析的过 阅读全文
posted @ 2019-11-11 22:55 雪山上的蒲公英 阅读(305) 评论(0) 推荐(0) 编辑
摘要:垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情: 哪些内存需要回收 阅读全文
posted @ 2019-10-15 01:34 雪山上的蒲公英 阅读(388) 评论(2) 推荐(1) 编辑
摘要:在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能。本节探究主要基于jdk1.8的内存结构。 1. Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路 阅读全文
posted @ 2019-08-02 02:53 雪山上的蒲公英 阅读(1800) 评论(0) 推荐(0) 编辑
摘要:本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。 1. 对象的创建 Java是一门面向对象的编程语言。在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象 阅读全文
posted @ 2019-07-24 02:10 雪山上的蒲公英 阅读(382) 评论(0) 推荐(0) 编辑
摘要:1. 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民”——既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任。 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写 阅读全文
posted @ 2019-07-23 02:13 雪山上的蒲公英 阅读(381) 评论(0) 推荐(0) 编辑

/* 返回顶部代码 */
点击右上角即可分享
微信分享提示