
java虚拟机
qq_20009015
欢迎关注我的公众号《程序员与王子喵》
展开
-
如何看懂GC日志
先在idea上设置好jvm启动参数-Xms20M 最大堆空间20m-Xms20M 最小堆空间20m-Xmn 10 新生代10m因此老年代也就只有10m了-xx:+PrintGCDetails 表示打印GC日志-xx:SurvivorRatio=8表示 在新生代中 eden区和survivor区的大小比值为8比1运行代码 private static final int _1MB ...原创 2019-03-26 00:17:07 · 7865 阅读 · 7 评论 -
不同垃圾收集器种类的GC日志
jvm的垃圾收集器分为新生代和老年代的收集器,使用的算法不一样新生代采用复制算法,就是保留一个eden区,两个survivor区,默认是8:1:1当eden区满了,就执行minorGC将对象回收,幸存的对象就被复制到to survivor区,然后eden区另一个survivor区清空。 下一次回收重复执行以上。复制到survivor区的时候发现装不下,会被放到老年代去当来了一个对象,e...原创 2019-03-27 23:54:50 · 478 阅读 · 0 评论 -
java虚拟机笔记(十四)java锁优化
锁优化jdk5升级到jdk6 花了大量的精力去实现各种锁优化技术:自旋锁,自适应自旋,锁消除,锁膨胀,轻量级锁,偏向锁1.自旋锁互斥同步对性能最大的影响是阻塞,挂起线程和恢复线程都需要上下文切换, 但大多数时候 共享变量的锁定只会持续很短的时间,因此让想获取锁的线程,先自旋等待一段时间,而不是进入阻塞。缺点:自旋需要占用处理器的时间,如果自旋时间很短 那么很划得来,但是长时间自旋,就浪...原创 2020-04-02 18:00:43 · 236 阅读 · 0 评论 -
java虚拟机笔记(十三)线程安全的实现方式
线程安全:多个线程存在共享数据访问的场景下 ,线程安全可以分为五个级别1.不可变不可变对象是线程安全的,被final修饰的基本类型变量java中的BigInteger 和BigDecimal Long Double String 等不可变对象 需要保证对象的行为 不影响对象的状态 。比如说String的subString()方法 返回的是一个新的对象,而非改变它本身的值。2.绝...原创 2020-04-02 00:49:13 · 280 阅读 · 0 评论 -
java虚拟机笔记(十二)java线程原理
java和线程:线程和比进程更轻量级的调度执行单位,线程的引入,使得进程的资源分配和调度分开, 线程之间共享进程的资源,但是执行各自独立调度。线程目前是java里面最小的调度单位。线程的实现:1.内核线程实现:也叫1:1实现,内核线程是由操作系统内核支持的线程,由内核完成线程的切换,内核通过控制调度器对线程进行调度,并负责把线程的任务映射到处理器上。程序使用的是内核线程的接口-轻量级...原创 2020-04-02 00:48:13 · 250 阅读 · 0 评论 -
java虚拟机笔记(十一)java内存模型和先行发生原则
为了解决处理器与内存速度之间的矛盾,引入了高速缓存,每个处理器都有自己的高速缓存,但是又共享同一个主存,使用时先将一部分数据读到处理器的缓存中,处理器需要的时候则可以自己直接从自己的缓存中获取,要比去主存中获取快不少。但是这样又引入了新的问题:缓存一致性问题。 有时候同一块数据,处理器上的缓存数据和主存数据不一致,因为有其他处理器去更新过这块主存数据。 那么以谁为准,就需要新的协议来协调,比...原创 2020-04-02 00:46:47 · 192 阅读 · 0 评论 -
java虚拟机笔记(十)编译器优化技术
编译器优化技术:之前说的分层编译,栈上替换 是编译器策略,也是一种优化。语言相关的优化技术有:类型继承分析,自动装箱消除,逃逸分析,锁消除,锁膨胀。代码相关的优化技术:方法内联方法内联:编译器最重要的优化手段,消除方法调用的成本,同时为其他优化手段建立基础。比如说方法A调用了方法B,方法内联 就是将方法B的代码 都放到方法A中,合并成一个方法。这样做的好处就是可以减少方法出栈入栈的次...原创 2020-03-30 00:33:08 · 249 阅读 · 0 评论 -
java虚拟机笔记(九)前端编译器和后端编译器
前端编译器:将java文件编译成class文件的编译器。java很多提高效率和友好度的语法糖都是依赖前端编译器实现的。javac就是一个典型的前端编译器。执行过程如下:1.准备阶段:初始化插入式注解处理器2.解析与填充符号表阶段:词法 语法分析,将源代码转变为标记集合,构建抽象语法树填充符号表,产生符号地址和符号信息。3.插入式注解处理器的执行阶段:会影响javac的行为,比...原创 2020-03-30 00:32:09 · 1100 阅读 · 0 评论 -
java虚拟机笔记(八)虚拟机字节码执行引擎
虚拟机字节码执行引擎虚拟机是相对物理机而言的,都能够执行代码。但是物理机的执行直接建立在指令集,寄存器,操作系统层面上,严重依赖平台。java通过虚拟机屏蔽了这一层,通过虚拟机执行字节码,内部由虚拟机转为平台支持的二进制指令。虚拟机的执行代码的时候,有解释执行和编译执行两种。解释执行由解释器执行,编译执行由即时编译器产生本地代码执行。java虚拟机以方法作为最小的执行单元,栈帧则为支持...原创 2020-03-28 02:16:24 · 233 阅读 · 0 评论 -
java虚拟机笔记(七)类加载机制
类加载机制类的生命周期加载-验证-准备-解析-初始化-使用-卸载虚拟机规范里面并没有强制要求什么时候开始加载,由不同版本的虚拟机自己实现,但是强制约束了什么时候初始化。1.遇到new ,getstatic,putstatic,invokestatic这个指令时,如果类型没有进行过初始化,则必须先触发初始化。场景有new关键字创建对象时候读取或者设置静态字段时候调用静态方法时候2...原创 2020-03-28 02:13:50 · 185 阅读 · 0 评论 -
java虚拟机笔记(六)类文件结构和jvm指令
类文件结构所有虚拟机平台都支持Class文件,也就是字节码。 任何基于虚拟机平台运行的语言,也要将代码编译成字节码。 从而实现了 一次编写,到处运行,通过虚拟机屏蔽了底层的硬件细节。1.Class文件里面 开头4个字节是魔数,标识版本。2.紧跟着就是常量池入口,常量池是Class文件结构里面与其他项目关联最多的数据,也是占用Class文件空间最大的数据项目之一。常量池里面主要放字面量 和符...原创 2020-03-28 02:11:47 · 227 阅读 · 0 评论 -
java虚拟机笔记(五)基础故障处理工具
基础故障处理工具当出现内存方面的问题时候,能够有帮助的东西有异常堆栈 查异常位置虚拟机运行日志垃圾收集器日志 查gc过程线程快照(threaddump/javacore) 查死锁堆转储快照(headdump/hprof) 查内存泄漏jps命令,用来查看java的进程信息,显示main的类名称,进程ID,进程的启动参数。主要用来取进程ID 和jps -l 或者jps -v 看是哪个进程...原创 2020-03-28 02:10:21 · 176 阅读 · 0 评论 -
java虚拟机笔记(四)垃圾收集器和策略
4.垃圾收集器和策略java区别于c++的最大不同点,java拥有动态内存分配和垃圾收集技术。栈中的区域的数据,比如说局部变量,随着线程消亡,自然会释放。但是堆中的对象则不然,这部分内存的分配和回收都是动态的,垃圾收集器也是关注堆中的内存回收。垃圾回收时有三个要素要考虑:1.哪些内存需要回收2.什么时候回收3.如何回收1.哪些内存需要回收需要判断出死亡的对象,死亡的对象是指不可能...原创 2020-03-28 02:08:54 · 275 阅读 · 0 评论 -
java虚拟机笔记(三)内存溢出异常
3.内存溢出异常。3.1 java堆溢出:复现如下java堆用来存储对象实例,只要不断创建对象,利用强引用避免垃圾回收清除对象,那么随着对象的增多,总容量触及最大堆空间限制之后就会抛出内存溢出异常。通过参数 -XX:+heapDumpOnOutOfMemoryError ,可以让虚拟机在出现内存溢出异常的时候保存堆快照 。报错信息是: java.lang.outofMemoryErro...原创 2020-03-28 02:06:41 · 270 阅读 · 0 评论 -
java虚拟机笔记(二)对象的创建,结构以及访问
对象2.1 对象创建过程new指令执行的时候,先看这个指令的参数 也就是对象的类型,能不能在方法区的常量池里面找到,具体就是去常量池里面找这个类的符号引用,并且检查这个符号引用代表的类 是否已经加载,如果没有 就要执行 加载,解析,初始化的过程,把这个类加载到方法区里面,然后,根据这个类,为对象分配空间,分配空间的具体流程就是,在堆中,划分一块内存区域出来,划分的方式堆空间是否连续,有两种...原创 2020-03-28 02:05:28 · 158 阅读 · 0 评论 -
java虚拟机笔记(一)jvm的内存模型
1.jvm的内存模型jdk( java development kit )java开发的最小环境,包括java语言,java虚拟机,java类库虚拟机在java程序运行中,将其管理的内存,划分为不同的几个区域:1.方法区2.堆3.虚拟机栈4.本地方法栈5.程序计数器其中虚拟机栈和本地方法栈以及程序计数器是线程私有的,方法区和堆是线程共享的。以上统称为运行时数据区。程序计数器:...原创 2020-03-28 02:03:50 · 225 阅读 · 0 评论