
Java虚拟机
文章平均质量分 82
惜暮
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
6.《深入理解Java虚拟机》HotSpot 的算法实现
前面的blog在理论上介绍了对象存活判定算法和垃圾收集算法,然而在HotSpot虚拟机上实现这些算法时必须对算法的执行效率有足够严格的考量,才能保证虚拟机高效运行。1.可达性分析算法中的枚举根节点在对象存活算法的可达性分析算法中从GC Roots节点找引用链这个操作为例。其中可达性分析对执行时间的敏感点的一个体现就是GC停顿上面,因为这项分析工作必须在一个能确保一致性的快照中进行–这里的一致性是指在原创 2017-01-02 10:32:54 · 598 阅读 · 0 评论 -
5.《深入理解Java虚拟机》垃圾收集算法思想
前面一篇博文讲了怎么判断哪些对象是可以被收集的,确定了哪些对象可以被回收之后,自然需要研究的是如何对对象进行回收。下面主要介绍几种算法的思想以及其发展过程:首先普及两个概念: 新生代:主要用来存放新生的对象。 老年代:主要用来存放应用程序中生命周期长的内存区域。 持久代:主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。垃圾收集算法1. 标记-清除算法这是最原创 2017-01-01 19:43:28 · 421 阅读 · 0 评论 -
4.《深入理解Java虚拟机》对象是否可回收?
接下来的几篇博文就讨论如下问题: 1. 哪些内存需要回收(Java堆和方法去区) 2. 什么时候回收; 3. 如何回收。 对象已死吗?Java堆里面几乎存放了所有的对象,垃圾收集器在对堆进行回收前,第一件事情就是确定哪些对象已经”死去”(即不可能再被任何途径使用的对象).下面介绍两种判断对象是否已死的算法:1. 引用计数算法这个算法的实现是:给对象中添加一个引用计数器,每当一个地原创 2017-01-01 19:13:41 · 509 阅读 · 0 评论 -
3.《深入理解Java虚拟机》内存溢出实例分析
1.堆溢出Java堆的唯一作用就是存储对象实例的数据,只要我们不断的创建新的对象并保证这些新的对象不被Gc回收,当对象数量达到一定容量超过堆的最大容量就会产生内存溢出的异常。 测试代码如下:package JVM;import java.util.ArrayList;import java.util.List;/** * Created by louyuting on 17/1/1. * 测原创 2017-01-01 17:51:10 · 497 阅读 · 0 评论 -
2.《深入理解Java虚拟机》Hotspot虚拟机中的对象创建与访问定位
本文主要针对以下问题:对于虚拟机中的对象是如何创建的,对象的内存是如何布局的以及如何访问对象。1. 对象的创建 在Java中对象的创建主要是通过new这个关键字来实现的,那么一个对象的创建过程是怎样的呢?通过下面几步来描述:当虚拟机遇到一个new关键字时,首先去检查这个指令的能否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有那必须先执行相应的原创 2016-07-31 13:25:22 · 599 阅读 · 0 评论 -
1. 《深入理解Java虚拟机》Java运行时数据区域
java与C++之间在内存分配与回收上的最大区别就是:C++是内存动态分配而Java是由垃圾收集技术解决的。1.运行时数据区域Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途、创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随线程的开始和结束而创建和销毁。Java虚拟机所管理的内存将会包括以下几个运原创 2016-07-30 11:43:55 · 647 阅读 · 0 评论 -
13.《深入理解Java虚拟机》Java与线程
Java与线程在Java里面的并发大多与多线程脱离不了关系;线程的实现我们知道,线程是比进程更加轻量级的调度执行单位。各个线程可以共享进程资源,又可以独立调度。在Java的Thread类中,我们观察源码可以发现,它的所有关键方法都声明成了Native方法,这表示这个方法的实现一般都是与平台相关的。在实现线程主要有三种方法: 1. 使用内核线程实现; 2. 使用用户线程实现; 3. 使用用户线程原创 2017-01-04 11:33:30 · 1592 阅读 · 0 评论 -
12.《深入理解Java虚拟机》Java内存模型JMM
TPS: 每秒事物处理数是衡量一个服务性能好坏高低的重要指标之一。1. Java的内存模型Java虚拟机规范中试图定义一种Java内存模型JMM来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常原创 2017-01-03 12:57:09 · 865 阅读 · 0 评论 -
11.《深入理解Java虚拟机》类加载器与双亲委派模型
2017-1-2 20:20 写了一天的blog和看书,看不下去了,回去健身。明天再写。 2017-1-2 23:00 回到寝室我还是妥协了,还是先把这个写完吧。类与类加载器虚拟机设计团队把类的加载阶段中的”通过一个类的全限定名来获取此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为”类加载器”。类加载器虽然只用于原创 2017-01-02 20:17:52 · 584 阅读 · 0 评论 -
9.《深入理解Java虚拟机》对象分配与回收策略
Java技术体系的自动化内存管理最终可以归结为:给对象分配内存和回收分配给对象的内存。关于内存的回收前面已经很详细的讲解了垃圾收集器,下面探讨给对象分配内存:对象的内存分配,往大的方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃原创 2017-01-02 14:02:14 · 475 阅读 · 0 评论 -
8.《深入理解Java虚拟机》内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
内存溢出和内存泄露的区别内存溢出:指的是程序在申请内存的时候,没有足够大的空间可以分配了。内存泄露:指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无用。内存泄露一般都是因为内存中有一块很大的对象,但是无法释放。从定义上可以看出,内存泄露终将导致内存溢出。注意,定位虚拟机问题内存问题的时候第一步就是要判断到底是内存溢出还是内存泄露,前者好判断,跟踪转载 2017-01-02 13:46:58 · 1355 阅读 · 0 评论 -
7.《深入理解Java虚拟机》垃圾收集器-垃圾收集算法的具体实现
前面简要介绍了HotSpot是如何去发起内存回收的问题,但是没有涉及具体的内存回收动作。下面介绍GC收集器,讨论垃圾回收的具体算法的实现。不同虚拟机所提供的垃圾收集器可能会有很大差别,我们使用的是HotSpot,HotSpot这个虚拟机所包含的所有收集器如图: 上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,那说明它们可以搭配使用。虚拟机所处的区域说明它是属于新生代收集器还是老原创 2017-01-02 13:40:36 · 548 阅读 · 0 评论 -
10.《深入理解Java虚拟机》虚拟机类加载机制
本篇blog主要是讲解一下两点内容: 1. 虚拟机如何加载这些Class文件? 2. Class文件中的信息进入到虚拟机之后会发生什么变化?与C/C++不同,Java里面类型的加载、连接和初始化过程都是在程序运行期间完成的。这种策略虽然会稍微增加性能开销但是换来了高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖于运行期间动态加载和动态连接的特点实现的。1. 类加载的时机类从被原创 2017-01-02 19:48:53 · 603 阅读 · 0 评论