
深入理解Java虚拟机
文章平均质量分 72
稳重的二哈
Java web 开发
展开
-
GC回收之一:判断对象存活算法、四种引用、回收方法区
当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,就需要对GC和内存分配的技术实施必要的监控和调节。判断对象是否存活的算法:1、引用计数算法 给对象添加一个引用计数器,当有一个地方引用它时,计数器值就加1;当引用失效时,计数器就减1;任何时候计数器都为0的对象就是不可能再被使用的。引用计数器算法(Reference Counting)实现简单...原创 2018-05-01 21:51:17 · 2823 阅读 · 0 评论 -
线程
并发不一定要依赖多线程(如PHP中很常见的多进程并发)。但是Java里面谈论并发,大多数都与线程脱不开关系。每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。Thread类的所有关键方法都是声明为Native的。在Java API中,一个Native方法往往意味着这个方法没有使用或无法使用平台无关的手段来实现(也可能是为了执行效率而使用...原创 2018-06-10 18:48:47 · 224 阅读 · 0 评论 -
高效并发之线程安全
高效并发:首先需要保证并发的正确性,然后在此基础上实现高效。1、Java语言中的线程安全不可变绝对线程安全相对线程安全线程兼容线程对立2、线程安全的实现方法互斥同步非阻塞同步无同步方案...原创 2018-06-25 22:21:47 · 352 阅读 · 0 评论 -
早期(编译期)优化(一)----编译过程
编译过程大致分为三个过程:解析与填充符号表过程插入式注解处理器的注解处理过程分析与字节码生成过程下面详细说明这三个过程的主要内容1.解析与填充符号表过程1.2解析结果包括词法分析和语法分析,词法分析是将源代码的字符流转变为标记(Token)集合语法分析是根据Token序列来构造抽象语法树的过程,抽象语法树(AST,Abstract Syntax Tree)是一种用来描述程序代码语法结构的树形表示方...原创 2018-05-30 22:21:36 · 499 阅读 · 0 评论 -
Java内存模型(JMM)、“先行发生”原则
Java内存模型(Java Memory Model,JMM)的主要目标是定义程序各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。JMM规定所有变量都存储在主内存(Main Memory)中,线程间变量值的传递均需要通过主内存来完成。内存间交互操作JMM定义了8种操作来完成主内存与工作内存之间的交互,这8种操作具有原子性、不可再分性(对于double、long类型...原创 2018-06-04 22:41:18 · 1038 阅读 · 0 评论 -
GC回收之四:JDK主要命令行工具 & 可视化工具
Sun JDK监控和故障处理工具:jps(JVM Process Status Tool) 虚拟机进程状况工具,显示指定系统内所有的HotSpot虚拟机进程jstat(JVM Statistics Monitoring Tool) 虚拟机统计信息监视工具,用于收集HotSpot虚拟机各方面的运行数据jinfo(Configuration Info for Java) Java配置信息工具,显示...原创 2018-05-05 19:13:49 · 363 阅读 · 0 评论 -
GC回收之三:内存分配
自动内存管理主要解决了两个问题:给对象分配内存和回收分配给对象的内存。对象的内存分配,主要是在堆上分配(有些可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的 具体规则取决于当前使用的是哪一种垃圾收集器,还有虚拟机中与内存相关的参数的设置。下面介绍几条最...原创 2018-05-05 15:54:02 · 286 阅读 · 0 评论 -
内存溢出异常(OutOfMemoryError)
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。虚拟机启动参数的设置: 如果使用控制台命令来执行程序,那么直接跟在Java命令之后书写即可。 如果使用Eclipse IDE,则可以在Debug/Run页签设置(Debug Configurations->Arguments->...原创 2018-04-27 10:18:55 · 2524 阅读 · 0 评论 -
访问对象两种方式--句柄和直接指针
由于reference类型在Java虚拟机规范里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄和直接指针。1、使用句柄访问方式如果使用句柄访问方式,Java堆中会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了...原创 2018-04-26 16:43:50 · 12320 阅读 · 2 评论 -
JVM运行时数据区域、直接内存
一、JVM运行时数据区域其中方法区、堆是由所有线程共享的数据区,虚拟机栈、本地方法栈、程序计数器是线程隔离的数据区。1、程序计数器(Program Counter Register) 它是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来...原创 2018-04-26 16:02:06 · 1446 阅读 · 2 评论 -
GC回收之二:4种垃圾收集算法及7种垃圾收集器
本文主要介绍4种垃圾收集算法及8种垃圾收集器:垃圾收集算法1、标记-清除算法(Mark-Sweep)“标记-清除”算法是最基础的算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。它主要由两个缺点:一个是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程...原创 2018-05-04 10:06:22 · 19511 阅读 · 9 评论 -
高效并发之锁优化
自旋----优化---->适应性自旋(Adaptive Spinning):用于线程占用共享数据时间很短的情况下。锁消除(Lock Elimination):用于实际上不需要加锁的情况。锁粗化(Lock Coarsening):用于频繁加锁解锁的情况。轻量级锁(Lightweight Locking):相对于使用互斥量的传统锁,轻量级锁并不是用来代替重量级锁的。他的本意是在没有多线程竞争的前...原创 2018-06-25 22:36:18 · 392 阅读 · 0 评论