![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java虚拟机
文章平均质量分 57
总结深入java虚拟机的知识和理解
坐飞机的狗
熟悉java技术,熟悉java常用设计模式,熟悉java高并发程序设计,了解jvm调优;熟悉基于spring boot+Mybatis的网站后端开发;了解go web开发,熟悉基于RPC + go 微服务开发;熟悉python常用的数据分析库(pandas\sklearn\tensorflow等)、爬虫框架(scrapy)、django后端开发;熟悉mysql的使用;了解前端HTML+CSS+Javascript;了解常用的机器学习算法;熟悉git常用操作。
展开
-
双亲委派机制
JDK中ClassLoader默认设计模式分类BootStrap ClassLoader(启动ClassLoader)Extension ClassLoader (扩展ClassLoader)App ClassLoader (应用ClassLoader/系统ClassLoader)Custom ClassLoader(自定义ClassLoader)具体加载对象自底向上检查类是否已经加载,加载了就直接获取类自顶向下尝试加载防止了重复加载和核心类被篡改代码实现:protected原创 2021-05-19 20:59:57 · 97 阅读 · 0 评论 -
垃圾收集器概述
GC垃圾收集器Java堆内存被划分为新生代和老年代两部分,新生代主要使用复制和标记-清除算法;老年代主要使用标记-整理垃圾回收算法,因此Java虚拟机中针对新生代和老年代分别提供了多种不同的垃圾收集器。Serial垃圾收集器(单线程、复制算法)使用一个CPU或者一条线程去完成垃圾收集工作,并且在进行垃圾收集的同时,必须暂停其它所有的工作线程,直到垃圾收集结束。ParNew垃圾收集器(Serial+多线程、复制算法)多线程版本的Serial,默认开启和CPU数目相同的线程数,可以通过-XX:Par原创 2021-05-13 21:46:36 · 113 阅读 · 1 评论 -
Java堆逸出分析
浅堆一个对象结构所占用的内存大小深堆一个对象被GC后,可以真实释放的内存大小只能通过对象访问到的(直接或者间接)所有对象的深浅之和堆逸出:占用大量堆空间,直接逸出,解决方法:增大堆空间,及时释放内存。永久区逸出:生成大量的类。解决方法:增大Perm区,允许Class回收。Java栈逸出这里的栈溢出指,在创建线程的时候,需要为线程分配栈空间,这个栈空间是向操作系统请求的,如果操作系统无法给出足够的空间,就会抛出OOM。解决方法:减少堆内存减少线程栈.原创 2021-03-27 14:55:27 · 74 阅读 · 0 评论 -
性能监控工具
排除流程在进行性能监控和排除问题时,首先看是不是当前系统中的其它程序导致的,然后再查看是不是Java程序导致的,最后具体查看是那个Java程序导致--具体是什么问题 堆?线程?Linuxuptime top vmstat pipstatWindows任务管理器 perfmon Process Explorer pslistJava自带的工具1.jps列出Java进程,类似于ps命令-q: 指定jps只输出进程ID,不输出类的短名称-m:只输出传递给Ja原创 2021-03-27 13:24:49 · 110 阅读 · 0 评论 -
GC算法与种类
GC的概念GC算法引用计数法在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用, 即他们的引用计数都不为 0, 则说明对象不太可能再被用到,那么这个对象就是可回收对象。引用和去引用伴随加法和减法,影响性能 很难处理循环引用标记清除算法最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空原创 2021-03-18 16:42:19 · 206 阅读 · 3 评论 -
String位置解析
string不是基本数据类型,那么一个string的内存位置是什么呢?一共有两种情况:1、string直接赋值:String s = “String”;s的引用存在栈内存中,引用指向的String存在方法区的常量池中(先判断常量池中是否有一个haha,存在则直接指向)2、string对象new创建String s = new String(“String”);s的引用存在于栈内存中,引用指向的String对象,存在堆内存中(每new一次,在堆中创建一个新的haha对象)总原创 2021-03-18 12:30:01 · 355 阅读 · 0 评论 -
常用JVM配置参数
常用JVM配置参数Trace跟踪参数-verbose:gc -XX:+PrintGC 可以打印GC的摘要信息 [GC 4790K->374K(15872K), 0.0001606 secs] [GC 4790K->374K(15872K), 0.0001474 secs] [GC 4790K->374K(15872K), 0.0001563 secs] [GC 4790K->374K(15872K), 0.0001682 secs] -XX:+Prin原创 2021-03-17 21:21:10 · 145 阅读 · 0 评论 -
JVM运行机制
JVM基本结构PC寄存器每个线程拥有一个PC寄存器 在线程创建时 创建 指向下一条指令地址 执行本地Native方法时,PC的值为undefined PC寄存器不会发生OOM方法区保存装载类的信息 类型的常量池 字段、方法信息 方法字节码 通常和永久区(Perm)关联在一起JDK6时,String等常量池信息置于方法区。JDK7时,已经移到了堆。Java堆和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是原创 2021-03-16 20:03:26 · 84 阅读 · 0 评论 -
JVM、JMM、Java对象模型
一、JVM内存结构以上是Java虚拟机规范,不同的虚拟机实现会不同,但是一定会遵守规范。 方法区只是一种概念上的区域,没有规定这个区域应该处于何处。 不同版本的方法区所处的位置不同,某些版本的JDK中方法区是在堆中实现的。 运行时常量池用于存放编译器生成的各种字面量和符号引用,但是Java并不要求常量只有在编译期才能产生,比如运行期String.intern也会把新的常量放入池中。 直接内存,不由JVM管理,是利用本地方法库直接在堆外申请的内存区域。 堆和栈的数据划分不是绝对的,如HotS原创 2020-12-29 21:02:11 · 211 阅读 · 0 评论 -
JVM内存模型概述
Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的地层细节。(变量:实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数)原创 2020-10-20 14:38:13 · 116 阅读 · 0 评论 -
虚拟机类加载机制(二)
准备正式为类中定义的变量(静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。注意:这些变量都应当在方法区中分配,但是方法区只是一个逻辑区域。(1)<JDK7,HotSpot使用永久代来实现方法区;(2)>JDK8,类变量会随着Class对象一起存放在Java堆中。在这个时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。public static int value=123;在准备阶段初始值为0而不是123原创 2020-09-29 20:50:02 · 160 阅读 · 0 评论 -
虚拟机类加载机制(一)
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。概要:虚拟机如果要使用某个JAVA类型,就需要把描述类数据的Class文件加载到内存中,而后对数据进行校验、转换解析和初始化。与c++相比,Java的类型加载、连接和初始化都是在程序运行期间完成的,这会增加性能开销,同时为Java提供了诸如动态加载和动态连接的特点。例如Applet、JSP、OSGi等。内的加载时机一个类型从被加载到内存开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初原创 2020-09-25 20:24:03 · 81 阅读 · 0 评论 -
java虚拟机--类型转换指令
类型转换指令:将两种不同的数值类型相互转换【用户代码中的显示转换、字节码指令集中指令代码无法与数据类型一一对应的问题】1. 宽化类型转换虚拟机直接支持【无须显式转换】、小范围类型向大范围类型的安全转换int【4 byte】类型到long【8 byte】、double【8 byte】long【8 byte】类型到float【4 byte】、double【8 byte】long 类型转 float类型long–>float就属于小范围向大范围转换,不在于字节数的多少。说白了就是long型原创 2020-09-13 15:10:44 · 176 阅读 · 0 评论