Java虚拟机
Alan_Xiang
在读学生
展开
-
JVM垃圾收集器总结
我们在《JVM中的垃圾收集算法》中介绍了垃圾收集算法,如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,所以不同的厂商、不同版本的虚拟机可以根据需要提供不同的收集器。我们这里讨论的收集器是基于JDK1.7 Update 14之后的HotSpot虚拟机,其包含的所有收集器如图1所示: 图1 HotSpo原创 2016-11-02 21:34:28 · 411 阅读 · 0 评论 -
java agent基础原理
本文重点讲述javaagent的具体实现,因为它面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础,不过这篇文章里也会讲到JVMTIAgent(c实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。对于javaagent或许大家都听过,甚至使用过,常见的用法大致如下:java -javaagent:myagent.jar=mo转载 2018-04-02 13:28:20 · 2058 阅读 · 1 评论 -
JVMTI开发教程之一个简单的Agent
概述JVM TI是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以c/c++语言编写的动态共享库。JVMTI Agent原理: java启动或运行时,动态加载一个外部基于JVM TI编写的dynamic module到Java进程内,然后触发JVM源生线程Attach...转载 2018-04-02 11:44:26 · 1487 阅读 · 0 评论 -
Docker和虚拟机的区别
这是docker官网的图,可以看到虚拟化技术通过Hypervisor(虚拟机管理系统)为每个app启动一个Guest OS(客户机操作系统),也就是为每个app启动一个虚拟机。比较直观地说,vm通过Hypervisor对硬件资源进行虚拟化,而docker直接使用硬件资源,利用率上来看docker明显更具有优势。 上一组从知乎上看到的图: 可以看到,容器隔离的粒度更加小一点,而且多原创 2017-12-01 11:51:56 · 36766 阅读 · 1 评论 -
java方法调用之动态调用多态(重写override)的实现原理——方法表
转自:http://blog.csdn.net/fan2012huan/article/details/51007517上两篇篇博文讨论了java的重载(overload)与重写(override)、静态分派与动态分派,这篇博文讨论下动态分派的实现方法,即多态override的实现原理。 java方法调用之重载、重写的调用原理(一) java方法调用之单分派与多分派(二)本文大部分内容来自于IBM转载 2017-09-11 20:21:02 · 1489 阅读 · 0 评论 -
JVM方法调用的那些事
转自:http://www.jianshu.com/p/56a7c4b26b14前言Java具备三种特性:封装、继承、多态。Java文件在编译过程中不会进行传统编译的连接步骤,方法调用的目标方法以符号引用的方式存储在Class文件中,这种多态特性给Java带来了更灵活的扩展能力,但也使得方法调用变得相对复杂,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。方法调用所有方法调用的目标方法转载 2017-09-11 18:08:37 · 439 阅读 · 0 评论 -
从Java文件到字节码文件
本文涉及的javac编译器来自openjdk.javac的目录地址为:解压目录/langtools/src/share/classes/com/sun/tools/javac/javac编译器将Java编译成为一个有效的字节码文件会经历4个步骤:词法解析:将Java关键字排序,使得程序能有序运行。语法解析:词法解析后的Token序列整合为一颗抽象的语法树。语义解析:将抽象语转载 2017-08-07 14:53:27 · 1938 阅读 · 0 评论 -
JVM中的垃圾收集算法
1、标记-清除算法: 标记-清除算法是最基础的垃圾收集算法,它分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。关于标记过程,我们在《对象死亡的过程》中已经叙述过。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。此种算法有两个不足之处:一是效率问题,标记和清除两个过程效率都不高;二是空间问题,标记清原创 2016-11-02 19:47:12 · 573 阅读 · 1 评论 -
Java内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域,称为运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区,如下图所示。 程序计数器: 程序计数器是一块较小的内存空间,可以被看作是当前线程所执行的字节码的行号指示器,分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖这个计算器来完成。由于Ja原创 2016-11-02 16:21:26 · 312 阅读 · 0 评论 -
对象死亡的过程
在《JVM中判断对象是否存活的方法》这篇博文中,我们了解了主流的Java虚拟机都是通过可达性分析算法判断对象是否存活的。其实,即使在可达性分析算法中被判断为不可达的对象,也并非是“非死不可”的,它们此时处于“缓刑”阶段,要真正宣告一个对象的死亡,至少要经历两次标记过程:如果对象在可达性分析算法中被判断为不可达,即不存在任何GC Roots到这个对象的引用链,那么这个对象会被第一次标记,并进行一次筛选原创 2016-10-26 00:10:18 · 1448 阅读 · 0 评论 -
如何通过MyEclipse打印GC日志
第一步:右键项目或文件——Debug As——Debug Configurations。第二步:点击Arguments,在VM arguments中填写-Xloggc:G:/gc.log,点击Apply,最后点击Debug。(可在自己选定目录中生成gc.log,在这里我选择的是G盘目录下)第三步:进入G盘,这时候会看到在G盘中生成了文件“gc.log”,用记事本打开即可查看该文件运行的GC日志。原创 2016-10-24 15:50:35 · 2872 阅读 · 2 评论 -
JVM中判断对象是否存活的方法
Java中几乎所有的对象实例都存放在堆中,在垃圾收集器对堆内存进行回收前,第一件事情就是要确定哪些对象还“存活”,哪些对象已经“死去”(即不可能再通过任何途径被使用)。引用计数算法 首先需要声明,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存。 什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1.任何时刻计数器值为0原创 2016-10-24 15:51:16 · 2686 阅读 · 1 评论 -
JVM的类加载机制
虚拟机把描述类的数据从Class文件(这里所说的Class文件指一串二进制的字节流,无论以何种形式出现都可以)加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类加载的时机: 从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparatio原创 2016-11-03 11:37:33 · 440 阅读 · 0 评论 -
JVM中的内存分配策略
对象的内存分配,从大方向上将,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。 下面讲解集中最普遍的内存分配规则,并通过代码原创 2016-11-02 22:13:07 · 759 阅读 · 0 评论 -
偏向锁,轻量级锁,自旋锁,重量级锁的详细介绍
何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到...转载 2018-10-29 12:09:20 · 890 阅读 · 0 评论