随笔分类 -  JVM

摘要:1. 基本概念 程序:静态,用于完成某些功能的代码。 进程:动态,运行中的程序 线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。 2. JVM内存区域 堆:线程共享,存放实例对象 (OOM) 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的 阅读全文
posted @ 2019-08-25 21:07 Emyin 阅读(151) 评论(0) 推荐(0)
摘要:次收集器 Scavenge GC,指发生在新生代的GC,因为新生代的Java对象大多都是朝生夕死,所以Scavenge GC非常频繁,一般回收速度也比较快。当Eden空间不足以为对象分配内存时,会触发Scavenge GC。 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scave 阅读全文
posted @ 2019-08-08 21:51 Emyin 阅读(545) 评论(0) 推荐(0)
摘要:JDK常用JVM优化相关命令 bin 描述 功能 jps 打印Hotspot VM进程 VMID、JVM参数、main()函数参数、主类名/Jar路径 jstat 查看Hotspot VM 运行时信息 类加载、内存、GC[可分代查看]、JIT编译 命令格式:jstat -gc 10340 250 2 阅读全文
posted @ 2018-04-21 00:04 Emyin 阅读(309) 评论(0) 推荐(0)
摘要:示例: GCEasy的使用 阅读全文
posted @ 2018-04-20 22:43 Emyin 阅读(1600) 评论(0) 推荐(0)
摘要:常见的垃圾回收算法: 1. 引用计数法 : 无法解决循环引用的问题 2.标记清除算法:从根节点开始标记引用的对象,未被标记引用标记的对象可以被清除。 解决了循环引用的问题。但是效率较低,标记和清除都要遍历所有对象。GC时,需要停止应用程序(否则可能导致标记不准确)。碎片化严重。 3.标记压缩算法:标 阅读全文
posted @ 2018-04-20 22:18 Emyin 阅读(149) 评论(0) 推荐(0)
摘要:内存溢出定位与分析 1. 模拟内存溢出,向集合中添加极大数量的字符串 2. 运行参数: -Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError 结果: 定位死锁问题 将dump文件导入到MAT中分析 发现服务器的CPU的负载突然增 高了、出现了死锁、死循环等,我们 阅读全文
posted @ 2018-04-20 21:43 Emyin 阅读(164) 评论(0) 推荐(0)
摘要:自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing)。 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装(wrapper)类型。 之所以需要包装类型,是因为许多 Java 核心类库的 API 都是面向对象 阅读全文
posted @ 2018-04-20 18:22 Emyin 阅读(366) 评论(0) 推荐(0)
摘要:在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。 synchronized是利用锁(对象锁,类锁)的机制来实现同步的。 锁机制有如下两种特性: 互斥性:即在同一时间只允许 阅读全文
posted @ 2018-04-20 17:47 Emyin 阅读(549) 评论(0) 推荐(0)
摘要:我们先来看一个反常识的例子。 这里我定义了两个共享变量 a 和 b,以及两个方法。第一个方法将局部变量 r2 赋值为 a,然后将共享变量 b 赋值为 1。第二个方法将局部变量 r1 赋值为 b,然后将共享变量 a 赋值为 2。请问(r1,r2)的可能值都有哪些? 在单线程环境下,我们可以先调用第一个 阅读全文
posted @ 2018-04-20 17:43 Emyin 阅读(172) 评论(0) 推荐(0)
摘要:1. 什么是分代,为什么要分代? 如果没有进行分代,新创建的对象和生命周期很长的对象放在一起,每次垃圾回收就需要遍历所有的对象,开销太大,严重影响GC效率。 分代后,新创建的对象会在新生代中分配内存,经过多次回收仍存活的对象放在老年代中。新生代中的对象存活时间短,只需要在新生代中进行频繁GC。老年代 阅读全文
posted @ 2018-04-20 17:31 Emyin 阅读(172) 评论(0) 推荐(0)
摘要:为什么要垃圾回收? 程序运行必然要申请内存资源,如果不再使用的对象一直占用内存资源必将导致内存溢出 什么样的对象需要被GC? 判断算法:计数器法,可达性分析算法 引用计数算法 它的做法是为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器为 0,则说明该对象已经死亡, 阅读全文
posted @ 2018-04-20 17:18 Emyin 阅读(182) 评论(0) 推荐(0)
摘要:在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机 阅读全文
posted @ 2018-04-20 13:21 Emyin 阅读(699) 评论(0) 推荐(1)
摘要:创建对象的多种方法:new语句,反射,clone, 反序列化 等 其中,Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。,而 new 语句和反射机制,则是通过调用构造器来初始化实例字段。 构造器 1. 如果一个类没有定义任何构造器的话, Java 编译器会 阅读全文
posted @ 2018-04-20 12:25 Emyin 阅读(2113) 评论(0) 推荐(0)
摘要:当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。上面的字节码中包含一个 monitorenter 指令以及多个 monitorexit 指令。这是因为 Java 虚拟机需要确保所获得的锁在正常执行路径,以及异常执行路径上 阅读全文
posted @ 2018-04-20 12:01 Emyin 阅读(246) 评论(0) 推荐(0)
摘要:前不久,“虚拟机”赛马俱乐部来了个年轻人,标榜自己是动态语言,是先进分子。 这一天,先进分子牵着一头鹿进来,说要参加赛马。咱部里的老学究 Java 就不同意了呀,鹿又不是马,哪能参加赛马。 当然了,这种墨守成规的调用方式,自然是先进分子所不齿的。现在年轻人里流行的是鸭子类型(duck typing) 阅读全文
posted @ 2018-04-20 11:55 Emyin 阅读(2714) 评论(0) 推荐(0)
摘要:反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 在 Web 开发中,我们经常能够接触到各种可配置的通用框架。为了保证框架的可扩展性,它们往往借助 Java 的反射机制,根据配置文件来加载不同的类。举例来说,Spring 框架的依赖反转(I 阅读全文
posted @ 2018-04-12 13:30 Emyin 阅读(257) 评论(0) 推荐(0)
摘要:javap 是一个能够将 class 文件反汇编成人类可读格式的工具。 使用javap 这里面我用到了两个选项。第一个选项是 -p。默认情况下 javap 会打印所有非私有的字段和方法,当加了 -p 选项后,它还将打印私有的字段和方法。第二个选项是 -v。它尽可能地打印所有信息。如果你只需要查阅方法 阅读全文
posted @ 2018-04-03 22:57 Emyin 阅读(493) 评论(0) 推荐(0)
摘要:众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可分为显式和隐式两种。 显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。 隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中 阅读全文
posted @ 2018-02-03 16:53 Emyin 阅读(203) 评论(0) 推荐(0)
摘要:1. 虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。 在绝大多数情况下,Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目 阅读全文
posted @ 2018-01-06 11:23 Emyin 阅读(246) 评论(0) 推荐(0)
摘要:重载与重写 在 Java 程序里,如果同一个类中出现多个名字相同,并且参数类型相同的方法,那么它无法通过编译。也就是说,在正常情况下,如果我们想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同。这些方法之间的关系,我们称之为重载。 重载的方法在编译过程中即可完成识别。具体到每一个方法调用 阅读全文
posted @ 2018-01-05 13:06 Emyin 阅读(513) 评论(0) 推荐(0)