
java虚拟机
hutongling
知行合一!
展开
-
ManagementFactory——java监控和管理JVM
近期在看相关代码的时候发现了一个比较有意思的类,这个类属于java的管理类,来的名字叫ManagementFactory,通过学习该类的相关源码发现这是一个用于监控和管理JVM的类。通过该类包含可以查看很多信息:操作系统模块、类加载器模块、编译器模块、内存管理模块、内存池管理模块、JVM在运行时管理的bean、JVM线程系统管理的bean等等信息通过对该源码的学习,后续工作中可能会将其用于监控JVM和相关的业务代码中在此通过简单的编码对其进行了解代码示例如下:import com.alibaba.原创 2020-06-07 21:18:20 · 3012 阅读 · 1 评论 -
Java中的深浅拷贝
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中原创 2017-04-24 19:17:50 · 280 阅读 · 0 评论 -
JVM学习笔记-内存管理机制
Java与C++之间有一堆由内存动态分配与垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 —— 《深入理解Java虚拟机:JVM高级特性与最佳实践》运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途。以及创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。程转载 2017-05-01 12:47:49 · 472 阅读 · 0 评论 -
JVM中的逃逸分析
逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。例如:public static StringBuffer craeteStringBuffer(String s1, String s2) { StringB转载 2017-04-28 16:23:41 · 550 阅读 · 0 评论 -
Java JVM 6:垃圾收集器(转载)
正文如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此 不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别, 并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。HotSpot虚拟机的垃圾回收器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可转载 2017-04-09 20:33:14 · 332 阅读 · 0 评论 -
Java JVM 5:G1 垃圾收集器概述
G1 垃圾收集器概述G1 好处G1垃圾收集器算是目前比较新的垃圾收集器,是用来替代 CMS 垃圾收集器。它有几个好处:可以和用户线程并发(和 CMS 一样) 可以进行压缩内存(不产生内存碎片问题) 可以像 Parallel Scavenge 那样实现可预测的停顿(这点也是非常主要的)内存结构上的区别G1 垃圾收集器和之前的一些垃圾收集器在内存结构上的划分有着比较大的不同,比如说,之前的一般内存结转载 2017-04-09 20:06:38 · 482 阅读 · 0 评论 -
Java JVM 4:CMS 垃圾收集器 - 工作原理,浮动垃圾,三色标记法等
CMS 全称为 Concurrent Mark Sweep。它是现在非常主流的一款老年代的垃圾回收器,因为它能够实现和用户线程并行进行,而不需要像其他的垃圾收集器一样(如 Serial Old,Parallel Old) “stop the world”。工作原理主要分为这几步:初始标记 并发标记 重新标记 并发清除在这四步中,其实初始标记和重新标记都是属于 “stop the world”转载 2017-04-09 20:00:04 · 9540 阅读 · 2 评论 -
Java JVM 2:垃圾收集算法 - 标记整理算法(伪代码实现与深入分析)
算法原理标记整理法首先需要标记出存活的对象,然后所谓的整理就是把这些存活的对象往一端推。然后就清除边界以外的区域即可。老年代的垃圾回收器(例如 Serial Old,Parallel Old,到那时不包括CMS,CMS使用的是标记清除法)都是采用这个算法,主要由于老年代的对象都比较持久,不是短暂的。这样一看,每次整理,将不会产生内存碎片问题,因为也没有分配对象需要查空闲链表了。伪代码实现只要涉及到对转载 2017-04-09 19:52:55 · 821 阅读 · 0 评论 -
方法区的垃圾回收
很多人以为方法区(或者HotSopt VM中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且性价比一般较低,在对的新生代生一般能回收70%~95%的空间,而永久代远低于此。永久代的垃圾手机主要回收两部分内容:废弃常量和无用的类。 回收废弃常量与回收Java堆中的对象非常相似。以常量池中字面量的回收为例,若字符串“abc”已经进入常量池中,但当前系统没原创 2017-04-01 17:04:17 · 7158 阅读 · 5 评论 -
判断Java中对象存活的算法以及Java中存在的几种引用
判断Java中对象存活的算法:(1)引用计数算法:给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减一;任何时刻计数器为0的对象都是不可能在被使用的。这中方法的实现简单,判断效率也高,在大部分情况下是个不错的算法,有一些比较有名的应用案例,但是至少主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最重要的原因是它很难解决对象之间循环引用的问题;原创 2017-04-01 11:23:43 · 1459 阅读 · 0 评论 -
Java内存溢出及解决办法
一、Java内存溢出的原因: (1)内存中加载的数据量过于庞大,,如一次性从数据库中取出过多的数据; (2)集合类中有对对象的引用,使用完之后未清空,使得JVM不能回收; (3)代码中存在死循环或者循环产生过多重复的对象尸体; (4)使用的第三方软件中的Bug; (5)JVM的启动参数设定的过小。二、解决Java内存溢出的方案: 第一步:修改JVM的启动参数,直接增加内存(使用-Xms,原创 2017-04-01 10:41:18 · 3891 阅读 · 0 评论 -
Java JVM 1:垃圾收集算法 - 标记清除算法(伪代码实现与深入分析)
标记清除法顾名思义,标记了,然后清除。这样一来会有大量的内存碎片。虽然如此,不过也有一些垃圾回收器采用他,例如现在最流行的 CMS 垃圾回收器。算法原理《深入理解 Java 虚拟机》中写道:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 这句话其实个人是比较怀疑的。因为一般来说是先标记出还在活动的对象,因为可以根据 GC roots 推出,而不是标记除需要回收的对象,因为个人转载 2017-04-09 19:46:41 · 583 阅读 · 0 评论 -
Java JVM 9:编译加载机制与自定义类加载器
编译机制编译主要是把 .java 文件转换为 .class 文件。 其中转换后的 .class 文件就包含了元数据,方法信息等一些信息。比如说元数据就包含了 Java 文件中声明的常量,也就是我们所说的常量池。Ps:在编译的时候,应该可以实现一个规范,这个规范可以使得在编译的时候执行一段你自己写的程序。例如 Lombok 的 @Data 注解帮我们产生 get set 方法的原理就是这个。类加载机制转载 2017-04-09 20:41:25 · 334 阅读 · 0 评论 -
Java JVM 8:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
在什么时候首先需要知道,GC又分为 minor GC 和 Full GC (也称为 Major GC )。Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区域。那么对于 Minor GC 的触发条件:大多数情况下,直接在 Eden 区中进行分配。如果 Eden区域没有足够的空间,那么就会发起一次 Minor GC;对于 Full GC(Major G转载 2017-04-09 20:39:06 · 3834 阅读 · 0 评论 -
Java JVM 7:内存结构
JVM 一般可以分为 PC 寄存器,JVM 方法栈,本地方法栈,JVM 方法区 以及 JVM 堆,如下图:PC 寄存器:可以看做是当前线程所执行的字节码的行号指示器。它属于每个线程所私有的。JVM 方法栈:由一条条的栈帧组成,每个栈帧又包括了局部变量区,操作数区,等。每个方法在执行的时候就会创建一个栈帧(所以说递归会产生大量的栈帧,假如此时又死循环了,那么这里栈帧过多,就会造成 stackoverf转载 2017-04-09 20:37:09 · 1445 阅读 · 0 评论 -
Java JVM 3:垃圾收集算法 - 复制算法(伪代码实现与深入分析)
复制算法主要用于新生代中,例如作用于新生代的垃圾处理器:Serial,ParNew,Parallel Scavenge 垃圾收集器,主要因为新生代的对象的存活时间比较短,所以采用这个算法折衷起来是比较好的。复制算法原理主要把 内存等分成A,B两块,每次只使用其中的一块,那么,每次垃圾回收的时候,就把使用中的半块(例如A)的存活的对象移动到另外的半块中,然后,直接清除另外的半块(B块)。这样马上就会有转载 2017-04-09 19:54:59 · 1648 阅读 · 0 评论 -
Java垃圾收集算法
Java虚拟机垃圾收集算法一共分为四种: 标记-清除算法、复制算法、标记-整理算法、分代收集算法1、标记-清除算法 这是一种最基础的算法。该算法分为“标记”和“清理”两个阶段:首先标记除所有要回收的对象,在标记完后统一回收所有被标记的对象,其标记过程与对象标记判定一致。 不足: (1)效率问题,标记和清除两个过程效率都不高 (2)空间问题,标记清除后原创 2017-04-01 17:36:33 · 355 阅读 · 0 评论