jvm原理

JVM类加载机制

自古美人都是妖i 提交于 2019-11-29 00:11:43
很多人觉得会写Java代码就行,Java底层怎么运行的不需要知道,但其实并不是这样,随着经验的积累,你需要了解越来越多的底层原理。我们先来看看下面的代码,看看class是怎样加载的。 public class BaseClass { static { System.out.println("BaseClass Init"); } public static final String value = "BaseClass"; } public class SubClass extends BaseClass { static { System.out.println("SubClass Init"); } } public static void main(String[] args) { System.out.println(SubClass.value); } 定义了一个父类BaseClass和子类SubClass,执行main方法会输出父类的“BaseClass Init”,而不是子类的,对于静态字段,,子类调用父类的静态字段吗,只会触发父类的初始化,而不会出发子类的初始化,为什么呢?下面我们来看下类的生命周期: 类从被加载到JVM内存中开始,到卸载出内存为止,它经历过了7个过程,包含加载(Loading)、验证(Verification)、准备(Preparation)、解析

2019 Java面试题

Deadly 提交于 2019-11-28 14:51:21
小编这里可是有Java面试题参考答案的哟,需要各位小伙伴下来逐一学习! 一、开场白 简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) 介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节;(主要对自己做过的事情是否有清晰的描述) 二、Java基础 什么是字符串常量池? String为什么是不可变的? String s = new String("xyz");究竟产生了几个对象,从JVM角度谈谈? String拼接字符串效率低,你知道原因吗? 你真的了解String的常见API吗? Java中的subString()真的会引起内存泄露么? 浅析Java中的final关键字? 浅析Java中的static关键字? 你对Java中的volatile关键字了解多少? i++是线程安全的吗?如何解决线程安全性? 从字节码角度深度解析 i++ 和 ++i 线程安全性原理? 请谈谈什么是CAS? 从源码角度看看ArrayList的实现原理? 手写LinkedList的实现,彻底搞清楚什么是链表? Java中方法参数的传递规则? Java中throw和throws的区别是什么? 重载和重写的区别? 手写ArrayList的实现

【深入理解Java原理】 JVM 内存区域

走远了吗. 提交于 2019-11-28 12:36:14
原文: http://blog.gqylpy.com/gqy/444 置顶:来自一名75后老程序员的武林秘籍——必读 (博主推荐) 来,先呈上武林秘籍链接: http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我会画原理图,会画 PCB,会模拟,会数字!玩过 PLC,玩过单片机,会用汇编,会用 C!玩过 ARM,比如 PLC,STM32,和时下正在起飞的 NXP RT1052!搞过 DSP,比如 TMS320F28335!搞过 FPGA,不管 Xilinx 还是 Altera,也不管是 Verilog 还是 VHDL,或者直接画数字电路图!我懂嵌入式系统,比如 uCOS 和 Linux!我懂开源的硬件,比如 Arduino 和树莓派!我也搞软件,学了一堆上位机的语言C#,JAVA,Python,Kotlin,Swift!会写爬虫工具,又自学写APP,不管Android 还是 IOS! 可是这一切有什么用呢?土鸡瓦狗!不值一提!干技术的永远就是最苦逼的那个人! 我相信看到这里的你,应该是个 IT

深入分析Java ClassLoader原理

痴心易碎 提交于 2019-11-28 10:28:08
一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是 BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以 ClassLoader就是用来动态加载class文件到内存当中用的。 二、Java默认提供的三个ClassLoader BootStrap ClassLoader :称为启动类加载器,是Java类加载层次中最顶层的类加载器, 负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等 ,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件: [java] view plain copy <EMBED id=ZeroClipboardMovie_1 height=18 name

深入分析 Java ClassLoader 原理

时间秒杀一切 提交于 2019-11-28 10:27:24
一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。 二、Java默认提供的三个ClassLoader BootStrap ClassLoader :称为启动类加载器,是Java类加载层次中最顶层的类加载器, 负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等 ,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件: [java] view plain copy 以下内容是上述程序从本机JDK环境所获得的结果: file:/C:/Program

java面试题(非原创)

情到浓时终转凉″ 提交于 2019-11-28 10:08:40
一、开场白 简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) 介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节;(主要对自己做过的事情是否有清晰的描述) 二、Java基础 什么是字符串常量池? String为什么是不可变的? String s = new String("xyz");究竟产生了几个对象,从JVM角度谈谈? String拼接字符串效率低,你知道原因吗? 你真的了解String的常见API吗? Java中的subString()真的会引起内存泄露么? 浅析Java中的final关键字? 浅析Java中的static关键字? 你对Java中的volatile关键字了解多少? i++是线程安全的吗?如何解决线程安全性? 从字节码角度深度解析 i++ 和 ++i 线程安全性原理? 请谈谈什么是CAS? 从源码角度看看ArrayList的实现原理? 手写LinkedList的实现,彻底搞清楚什么是链表? Java中方法参数的传递规则? Java中throw和throws的区别是什么? 重载和重写的区别? 手写ArrayList的实现,在笔试中如何过关斩将? finally语句块你踩过哪些坑?

jvm(6):JMM

走远了吗. 提交于 2019-11-28 06:32:24
typora-root-url: ./ CPU多核并发缓存架构 JMM(Java线程内存模型)底层实现原理 基于CPU缓存模型建立的,屏蔽掉了底层不同计算机的区别。 所有的共享变量都存储在主内存。每条线程还有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。 JMM数据原子操作 read(读取):从主内存读取数据到工作内存中,以便load load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 assign(赋值):将计算好的值重新赋值到工作内存中 store(存储):将工作内存数据写入主内存 write(写入):将store的变量值赋值给主内存中的变量 lock(锁定):将主内存变量加锁,标识为线程独占状态 unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量 深入汇编语言底层理解volatile关键字 共享变量改变,但是副本没有改变! 例子:Java private static boolean initFlag = false; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("waiting

【JVM】垃圾收集器和收集器的选择策略

大城市里の小女人 提交于 2019-11-27 21:44:06
前言:新生代的收集器有:Serial,ParNew,Parallel Scavenge等。老年代有:CMS,SerialOld,Paraller Old等。接下来将深入理解各个垃圾收集器的原理,以及它们如何在不同场景下进行搭配使用。 同时,先解释几个名次: 并行(Parallel):多个垃圾收集线程并行工作,此时用户线程处于等待状态 并发(Concurrent):用户线程和垃圾收集线程同时执行 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间) (一) 新生代的收集器们 (1) ParNew 这是Serial收集器的多线程版本,使用多线程对垃圾收集,采用复制算法,同时需要暂时所有用户线程。除了使用多线程其他与Serial收集器相比并没有什么创新。但是为什么还要学习它,那是因为除了Serial收集器,目前只有它能与CMS收集器配合工作。因此我们在Server中虚拟机首选项的新生代收集器还是它。可以使用的控制参数有:-XX:SurvivorRatio,-XX:PretenureSizeThreshold,-XX:HandlerPromotionFailure等(详情见官方手册)。 (2) Parallel Scavenge收集器 使用复制算法,同时也是并行收集器,相比ParNew,它更关注于达到一个可控制的吞吐量。高吞吐量可以高效率地利用CPU时间,尽快完成计算任务

javaagent使用指南

↘锁芯ラ 提交于 2019-11-27 15:46:25
今天打算写一下 Javaagent,一开始我对它的概念也比较陌生,后来在别人口中听到 字节码插桩 , bTrace , Arthas 后面才逐渐了解到Java还提供了这么个工具。 JVM启动前静态Instrument Javaagent 是什么? Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求: 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。 Premain-Class 指定的那个类必须实现 premain() 方法。 premain 方法,从字面上理解,就是运行在 main 函数之前的的类。当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行 -javaagent 所指定 jar 包内 Premain-Class 这个类的 premain 方法 。 在命令行输入 java 可以看到相应的参数,其中有 和 java agent相关的: -agentlib:<libname>[=<选项>] 加载本机代理库 <libname>, 例如 -agentlib:hprof 另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help -agentpath:<pathname>[=<选项>]

JVM 垃圾回收算法

丶灬走出姿态 提交于 2019-11-27 13:04:22
标记-清除算法 操作 把需要清楚的对象进行一一标记 标记完成之后统一清楚 缺点 标记和清楚的执行过程效率低 清理之后形成很多的空间碎片 如果此时需要一整块大一些的空间可能就放不进去 可能就又导致新的垃圾回收以配合内存申请 时间一长这样的碎片可能是越来越密集的 复制算法 基本复制算法 操作 把内存分为两块区域一块用于存放对象,另一块为空的内存区域 每次垃圾回收把用的区域中还存活的对象复制到空的区域中 优势 这样就不会形成内存碎片 而且效率较高 缺点 需要专门一块空间不放对象 对内存是一种浪费 HotSpot新生代 复制算法 操作 把垃圾回收分为三块区域分别是一块eden区,两块survior区域 三个大小比例是8:1:1 新的对象加入到 enden 区域 和 一块 survior区域 每次垃圾回收把这两个区域中还存活的对象放到第二个survior区域中 然后再把这个两个区域清空 原理 新生代中的对象都是 朝生夕死的,一般来说98%都会被清理掉 所以留10%的空间给能存活的2%的对象,大部分情况都足够了 分配担保机制 即使留10%也可能出现不够的情况 那么就让老年区在这种情况发现的情况下分配一下内存负担 之所以说是担保,也就是不一定总会帮忙借出内存 当达到担保的阈值的时候就不借出了 此时会执行Full GC确保能有足够的空间给新的对象 在Full GC之前都是Minor GC 标记