
jvm
laoxilaoxi_
码农,邮箱laoxilaoxi@foxmail.com
展开
-
java常用命令及实践
一、jinfojinfo可以查看java进程的扩展参数Usage:jinfo [option] <pid>(to connect to running process)jinfo [option] <executable <core>(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hos...原创 2020-12-24 21:18:33 · 308 阅读 · 2 评论 -
《深入理解JAVA虚拟机》13.线程安全与锁优化
一、线程安全代码本身封装了所有必要的正确性保证手段,令调用这个无需关心多线程问题,更无需自己采取任何措施来保证多线程的正确调用。1)线程安全的实现方法 互斥同步:synchronize、ReentrantLock。 非阻塞同步:CAS自旋,其中ABA问题一般不影响正确性。 无同步方案:可重入代码(传入相同的参数,就能返回相同的结果)、线程本地存储(ThreadLocal) 二、锁优化自适应性自旋、锁消除、锁粗化、轻量级锁、偏向锁等1)自旋锁与自...原创 2020-05-13 09:15:43 · 167 阅读 · 0 评论 -
《深入理解JAVA虚拟机》12.Java内存模型与线程
一、硬件的效率与一致性 处理器、高速缓存、主内存间的交互关系,如下图二、Java内存模型1)主内存与工作内存 主内存:所有的变量都存储在主内存。 工作内存:每个前程都有自己的工作内存,保存了被该线程使用到的变量的主内存副本拷贝。 线程、工作内存、主内存的交互关系,如下图2)内存间的交互操作(操作:作用域,作用) lock(锁定):主内存,把一个变量标识为一个线程独占状态。 unlock(解锁):主内存,把一...原创 2020-05-13 09:13:22 · 165 阅读 · 0 评论 -
《深入理解JAVA虚拟机》9.类加载及执行子系统的案例与实践
一、Tomcat:正统的类加载器架构从图中的委派关系中可以看出: CommonClassLoader能加载的类都可以被Catalina ClassLoader和SharedClassLoader使用,从而实现了公有类库的共用。 CatalinaClassLoader和Shared ClassLoader自己能加载的类则与对方相互隔离。 WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互原创 2020-05-13 09:11:41 · 225 阅读 · 0 评论 -
《深入理解JAVA虚拟机》7.虚拟机类加载机制
一、类加载的时机类的生命周期,如下何时需要进行类加载: 遇到new、getstatic、putstatic、invokestatic字节码指令。 使用java.lang.reflect包方法对类反射调用。 初始化一个类,其父类未初始化时。 虚拟机启动时,需要执行一个main方法,那么需要初始化该类。 jdk1.7动态语言支持时,当java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_p.原创 2020-05-13 09:09:40 · 175 阅读 · 0 评论 -
《深入理解JAVA虚拟机》3.垃圾收集器与内存分配策略
哪些内存需要回收? 什么时候回收? 如何回收? 一、对象已死1.引用计数算法 为对象添加一个引用计数器,一个地方引用,计数器加1,引用失效则减1,当计数器为0是,该对象将不再使用。该算法存在孤岛问题(循环依赖)。如下图,A对象与B对象,计数器均为1,但是已经废弃,通过该算法无法回收。2.可达性分析算法 从GC Roots出发,向下搜索,所有走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有...原创 2020-05-13 09:08:21 · 257 阅读 · 0 评论 -
《深入理解JAVA虚拟机》2.Java内存区域与内存溢出问题
一、运行时数据区域程序计数器:当前线程所执行的字节码的行号。Java虚拟机栈:每个方法在执行的时候都会创建一个栈帧,存储局部变量表。操作数栈、动态链接、方法出口。本地方法栈:为虚拟机使用到的Native方法服务。Java堆:所有线程共享的内存区域,存放对象实例。元空间( 方法区 ):存放类信息、常量、静态变量、即时编译器编译后的代码。别名Non-Heap非堆。运行时常量池:是方法区的一部分。直接内存:NIO中的channel与buffer可通过Native函数职级分配堆外内存,.原创 2020-05-13 09:06:13 · 129 阅读 · 0 评论 -
Java虚拟机学习-(4)类加载机制
类的加载过程加载:.class加载到方法区,并生成该类的Class对象。验证:规范验证,文件格式验证、元数据验证(类验证)、字节码验证(字节码指令、操作数验证)、符号引用验证(找类、方法、修饰符等)。准备:类变量分配内存。解析:符号引用变为直接引用,类、接口解析,类方法解析,接口方法解析,字段解析。初始化:执行<clinit>()类构造器。类加载...原创 2020-03-10 19:26:49 · 141 阅读 · 0 评论 -
Java虚拟机学习-(3)垃圾回收
垃圾收集(GC)需要两件事: 如何找出需要回收的内存? 如何回收这些内存?找出需要回收的内存 引用计数法(仅供学习)、可达性分析法、方法区回收条件引用计数法 给对象头添加一个引用计数器,被引用计数器就加1,引用失效减1,计数器为0,对象不再被引用,可被回收。 该算法存在孤岛问题,如下图,也就是A对象引用了B,B引用了A,A...原创 2020-03-10 19:25:30 · 171 阅读 · 0 评论 -
Java虚拟机学习-(2)内存区域
一、JVM内存布局1.虚拟机栈栈里存放的内调数据,叫栈帧。每个栈帧都包含四个区域:局部变量表、操作数栈、动态连接、返回地址局部变量表:方法参数、方法内部定义的局部变量。操作数栈:运行时操作码操作的的操作数。动态连接:Class文件的常量池中有大量符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。有些符号引用在运行期间转化为直接引用,这部分...原创 2020-03-10 19:24:49 · 135 阅读 · 0 评论 -
Java虚拟机学习-(1)概要
一、JVM、JRE、JDK分别是啥JVM:Java虚拟机JRE:Java运行时环境JDK:Java开发工具其中从大到小:JDK → JRE →JVM二、Java字节码 .java文件通过javac命令编译成.class文件,由操作码opcode+操作数组成三、Java代码如何运行解释执行: 字节码 →opcode+操作数 →机器码JIT:字节码 ...原创 2020-03-10 19:23:57 · 116 阅读 · 0 评论 -
Jvm内存总结(自用)
对于不同的Jvm及不同的jdk版本内存模型不同内存区域名称作用参数异常分析方法解决方案Heap堆内存存储对象-Xms -XmxJava.lang.OutOfMemeoryError:Java heap space使用内存分析工具查看问题1.调大-Xmx,2.优化代码Method Area方法区1.加载的类信息,2.常量,3.静态变量,4.编...原创 2019-01-05 10:17:14 · 203 阅读 · 0 评论