JVM
好马行千里
这个作者很懒,什么都没留下…
展开
-
JVM调优工具(一)
工欲善其事必先利其器,话不多说一个个记录。jdk除了最常用的javac、java命令之外,还有一系列的其他工具。都在%JAVA_HOME%\bin目录下。这些工具的程序体积都异常小巧。几乎所有工具的体积基本上都稳定在27KB左右。其实大多数是jdk/lib/tools.jar类库的一层薄包装而已,它们主要的功能代码是在tools类库中实现的。jps:虚拟机进程状况工具jstat:虚拟机统计信息监视...原创 2018-05-09 14:33:25 · 130 阅读 · 0 评论 -
GC算法
GC算法: 标记-清除(Mark-Sweep)算法,算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经介绍过了。之所以说它 是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之...原创 2019-08-01 14:34:16 · 309 阅读 · 0 评论 -
Java垃圾回收
判断对象存活: 1.引用计数法 2.可达性分析算法 虚拟机栈中引用的对象 类静态属性的引用 常量的引用 Native方法 引用: 强-Object obj=new Object(); 软-有用但并非必需的对象. 在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收. 如果这次回收还没有足够的内存,才会抛出内存溢出异常. 弱-无论当...原创 2019-07-31 14:37:24 · 135 阅读 · 0 评论 -
主内存与工作内存交互操作
主内存与工作内存 lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。 unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。 read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。 load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变...原创 2019-08-02 15:50:28 · 671 阅读 · 0 评论 -
Java虚拟机之七大垃圾回收器
GC分新生代和老年代,鸟瞰如下: Serial收集器 单线程,垃圾收集时,必须暂停其他所有的工作线程 Client模式下的默认新生代收集器.简单而高效(限定单个CPU,与其他收集器的单线程比) ParNew收集器 Serial收集器的多线程版本 除了Serial收集器外,目前只有它能与CMS收集器配合工作 Parallel Scavenge收集器 吞吐量优先(Throughput)的...原创 2019-05-17 16:25:30 · 278 阅读 · 0 评论 -
Java虚拟机之四大回收算法
标记-清除算法 最基础的收集算法,算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经介绍过了. 它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的. 主要不足有两个:效率问题,标记和清除两个过程的效率都不高;空间问题,标记清除之后会产生大量不连续的内存碎...原创 2019-05-17 16:18:47 · 301 阅读 · 0 评论 -
JVM常用命令
jps -q 只输出进程号 -m 输出main函数的参数 -l 输出类的全名,或者jar包路径 -v 输出jvm启动参数配置 jstat 类装载、内存、垃圾收集、JIT编译等运行数据 -class -gc -compiler -printcompilation jinfo 实时地查看和调整虚拟机各项参数 -sysprops -flag jmap 生成堆快照 -...原创 2019-05-21 10:45:30 · 156 阅读 · 0 评论 -
Java虚拟机之双亲委派
package java.lang; /** * * @ClassName: Object * @Description: TODO(这里用一句话描述这个类的作用) * @author pangning@58.com * @date 2019年5月7日 下午6:24:18 * */ public class Object { } 执行javac Object.jav...原创 2019-05-07 19:09:35 · 181 阅读 · 0 评论 -
Java虚拟机之类加载机制
类的生命周期如下图: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。注意,这里笔者写的是按部就班地“开始”,而不是按部就班地“进行”或“完成”,强调这点是因为这些阶段通常都是互相交叉地混合式进行的,通常会在...原创 2019-05-07 17:34:41 · 106 阅读 · 0 评论 -
Java虚拟机之GC日志
阅读GC日志是解决JVM问题的基础 33.125:[GC[DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K), 0.0031680secs]100.667:[FullGC[Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K), [Perm:2999K->2999K...原创 2019-05-07 14:53:08 · 371 阅读 · 0 评论 -
Java虚拟机之GC收集器
原创 2019-05-07 14:40:57 · 159 阅读 · 0 评论 -
Java虚拟机之GC基础
内存的动态分配与内存回收技术已经相当成熟,为什么我们还要去了解GC和内存分配呢? 需要排查各种内存溢出、内存泄漏问题。 GC成为系统瓶颈时,需要实施必要的监控和调节。 程序计数器、虚拟机栈、本地方法栈3个区域生命周期同线程; 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,方法结束或者线程结束时就跟随着回收了。 J...原创 2019-05-06 17:20:46 · 138 阅读 · 0 评论 -
JVM类加载学习(二)
类加载的过程是怎样的? 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。 加载阶段(可以参...原创 2018-04-26 11:34:11 · 125 阅读 · 0 评论 -
JVM类加载学习(一)
先上代码: public class GrandFather { static { System.out.println("GrandFather"); } public GrandFather() { System.out.println("init GrandFather"); } } public class Father extends GrandFather {...原创 2018-04-26 11:19:30 · 112 阅读 · 0 评论 -
JVM的垃圾回收
哪些内存需要回收? 什么时候回收? 如何回收? 1.对象是否存活 1.1引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 优点:实现简单,判定效率也很高;缺点:很难解决对象之间相互循环引用的问题 1.2可达性分析算法 一系...原创 2018-04-26 10:20:19 · 103 阅读 · 0 评论 -
Java虚拟机之破坏双亲委派
破坏双亲委派: 一个典型的例子便是JNDI服务,JNDI现在已经是Java的标准服务,它的代码由启动类加载器去加载,但JNDI的目的就是对资源进行集中管理和查找,它需要调用由独立厂商实现并部署在应用程序的ClassPath下的JNDI接口提供者(SPI,Service Provider Interface)的代码,但启动类加载器不可能“认识”这些代码啊!那该怎么办? 为了解决这个问题,Java设...原创 2019-05-08 13:58:25 · 249 阅读 · 0 评论 -
Java虚拟机之双亲委派模型
Java主要有两种类加载器:一种是启动类加载器(BootstrapClassLoader),这个类加载器使用C++语言实现[1],是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。从Java开发人员的角度来看,类加载器还可以划分得更细致一些,绝大部分Java程序都会使用到以下3种系...原创 2019-05-08 13:38:32 · 176 阅读 · 0 评论 -
JVM(一)
写一个Java 堆内存溢出的类:import java.util.ArrayList; public class HeapOOM { public static void main(String[] args) { ArrayList<String[]> arrayList = new ArrayList<String[]>(); while(true) { ...原创 2018-05-06 09:17:45 · 112 阅读 · 0 评论 -
类加载器
类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”.类加载器在类层次划分、OSGi、热部署、代码加密等领域大放异彩. 类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段.对于任意一个类...原创 2019-08-05 20:33:24 · 131 阅读 · 0 评论