jvm原理

java笔记整理

我与影子孤独终老i 提交于 2020-01-10 03:48:31
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / Java 7 为我们提供了什么新功能 什么是竞态条件? 举个例子说明。 JRE、JDK、JVM 及 JIT 之间有什么不同 MVC的各个部分都有那些技术来实现?如何实现? RPC 通信和 RMI 区别 什么是 Web Service(Web服务) JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制 简单说说你了解的类加载器。是否实现过类加载器 解释一下什么叫AOP(面向切面编程) 请简述 Servlet 的生命周期及其相关的方法 请简述一下 Ajax 的原理及实现步骤 简单描述Struts的主要功能 什么是 N 层架构 什么是CORBA?用途是什么 什么是Java虚拟机

JAVA基础(1)-JDK安装

[亡魂溺海] 提交于 2020-01-05 01:59:57
要想学习java语言,首先要搭建Java的开发环境,包括开发环境和运行环境,那就要下载jdk的安装包来进行搭建了 下载地址:链接: https://pan.baidu.com/s/1msUuHYRfIjxyPnwZEksNRw 密码: ssv4 首先我们先来了解一下JDK JDK :java development kit-java开发工具包 --java开发工具: 编译器,调试器,javadoc.exe. java.exe,javac.exe    --jre(java runtime environment)--java运行环境    --jvm(java虚拟机): 注意注意再注意: jdk安装路径一定不能有中文汉字。 java语言的一个特点:跨平台(操作系统)。因为每个平台上都有自己版本的jvm,而任何版本的jvm都会执行 java语言的运行原理:   java源文件(.java)   |   |----编译过程(javac.exe)   | javac 源文件名称(一定要带上扩展名)   | javac Demo.java   | java字节码文件(.class)   |   |---开启jvm,运行字节码文件   | java 字节码文件名称(千万不要写扩展名)   | java Demo   程序开始跑起来 接下来就开始正式安装了,下载完成后双击打开

java 虚拟机原理

青春壹個敷衍的年華 提交于 2020-01-04 17:59:12
什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码,ByteCode), 就可以在多种平台上不加修改地运行。这背后其实就是JVM把字节码翻译成具体平台上的机器指令,从而实现“一次编写,到处运行(Write Once, Run Anywhere)”。 Java为什么能够跨平台? Java引入了字节码的概念,jvm 只能认识字节码,并将它们解释到系统的API调用。针对不同的系统有不同的jvm实现,有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,但是同一段代码在编译后的字节码是一样的。在不同的系统平台上运行是通过JAVA解释器将字节码解释为不同平台的机器码,在不同的 jvm 实现上会映射到不同系统的 API 调用,从而实现代码的不加修改即可跨平台运行。 JVM、JRE、JDK的关系 JRE(Java Runtime Environment,Java运行环境),面向Java程序的使用者,而不是开发者。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件 JDK(Java Development Kit

探秘 Java 热部署三(Java agent agentmain)

让人想犯罪 __ 提交于 2019-12-31 02:52:36
前言 让我们继续探秘 Java 热部署。在前文 探秘 Java 热部署二(Java agent premain) 中,我们介绍了 Java agent premain。通过在main方法之前通过类似 AOP 的方式添加 premain 方法,我们可以在类加载之前做修改字节码的操作,无论是第一次加载,还是每次新的 ClassLoader 加载,都会经过 ClassFileTransformer 的 transform 方法,也就是说,都可以在这个方法中修改字节码,虽然他的方法名是 premain ,但是我们确实可以利用这个特性做这个事情。 在文章的最后,我们也提到了,虽然相比较在自定义类中修改字节码,premain 没有什么侵入性,对业务透明,但是美中不足的是,他还需要在启动的时候增加参数。 我们还提到了,premain 虽然可以热部署,但是还需要重新创建类加载器,虽然,这的确也符合 JVM 关于类的唯一性的定义。但是,有一种情况,如果使用的是系统类加载器,我们也无法创建新的ClassLoader对象。那么我们也就无法重新加载类了,怎么办呢?还好 Java 6 为我们提供了一种方法,也就是今天的主角 agentmain。 1. 什么是 agentmain? 和 premain 师出同门,我们知道,premain 只能在类加载之前修改字节码,类加载之后无能为力

JVM内存初学 堆、栈、方法区

筅森魡賤 提交于 2019-12-27 21:53:09
转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助。 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。 AppMain.java public class AppMain

Java类加载器ClassLoader总结

独自空忆成欢 提交于 2019-12-26 09:55:22
JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.forname()等方法,显式加载需要的类 类加载的动态性体现: 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现 java类装载器 JDK 默认提供了如下几种ClassLoader Bootstrp loader Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载 %JAVA_HOME%/jre/lib , -Xbootclasspath 参数指定的路径以及 %JAVA_HOME%/jre/classes 中的类。 ExtClassLoader Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher

JVM内存模型和面试题解析

我怕爱的太早我们不能终老 提交于 2019-12-21 04:10:55
一、JVM运行时区域      其中,      线程私有的:程序计数器,虚拟机栈,本地方法栈      线程共享的:堆,方法区,直接内存 1 程序计数器   程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。   java虚拟机的多线程是通过线程轮流切换并分配CPU的时间片的方式实现的,因此在任何时刻一个处理器(如果是多核处理器,则只是一个核)都只会处理一个线程,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,因此这类内存区域为“线程私有”的内存。   从上面的介绍中我们知道程序计数器主要有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。   注意: 程序计数器是唯不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 2 Java 虚拟机栈   Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是

JVM内存回收机制简述

被刻印的时光 ゝ 提交于 2019-12-18 05:54:47
JVM内存回收机制涉及的知识点太多了,了解越多越迷糊,汗一个,这里仅简单做个笔记,主要参考《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 目前java的jdk默认虚拟机为HotSpot,因此本文涉及虚拟机相关内容都指HotSpot虚拟机 本文主要关注GC的回收:判断哪些对象可回收,如何回收,回收机制 判断哪些对象可回收 GC是通过对象是否存活来决定是否进行回收,判断对象是否存活主要有两种算法:引用计数算法、可达性分析算法 引用计数算法 引用计数的算法原理是给对象添加一个引用计数器,每被引用一次计数器加1,引用失效时减1,当计数器0后表示对象不在被引用,可以被回收了,引用计数法简单高效,但是存在对象之间循环引用问题,可能导致无法被GC回收,需要花很大精力去解决循环引用问题 可达性分析算法 可达性分析的算法原理是从对象根引用(堆栈、方法表的静态引用和常量引用区、本地方法栈)开始遍历搜索所有可到达对象,形成一个引用链,遍历的同时标记出可达对象和不可达对象,不可达对象表示没有任何引用存在,可以被GC回收 如何回收   找到可回收对象后,如何进行回收呢?   内存回收算法主要有标记-清除、停止-复制、标记-整理,不同算法使用不同的场景,总体来说停止-复制算法适合对象存活时间短,存活率低的新生代,标记-清除和标记-整理算法适合对象存活时间长,存活率高的老年代 标记-清除

JVM各垃圾收集器对比

假如想象 提交于 2019-12-18 05:52:57
本随笔是《深入理解Java虚拟机 JVM高级特性与最佳实践》读书笔记。 1.JDK1.7之后的HotSpot虚拟机所包含的所有收集器如下: 解读: 1. 总共有7种垃圾收集器 2.Serial,ParNew,Parallel Scavenge 负责堆年轻代中的内存回收 3.Serial Old,CMS,Parallel Old 负责堆老年代中的内存回收 4.G1分代回收,能独立管理整个GC堆 5.两个收集器中间存在连线的,说明能够配合工作 各个收集器对比 名称 收集算法 工作区域 可配合对象 线程 并发 适用场合 优缺点 Serial 复制算法 新生代 CMS; Serial Old 单 否 单 CPU; Client 模式下 缺: stop the world; 优:简单高效 , 没有线程交互开销 , 专注于 GC; ParNew 复制算法 新生代 CMS; Serial Old 多 是 多 CPU; Server 模式下 缺: stop the world 优:并行并发 GC Parallel Scavenge 复制算法 新生代 Serial Old; Parallel Scavenge 多 是 吞吐量控制 ,Client,server 均可以 主要关注吞吐量 , 通过吞吐量的设置控制停顿时间 , 适应不同的场景 Serial Old 标记整理算法 老年代 Serial

JVM——垃圾收集器

浪尽此生 提交于 2019-12-18 05:52:00
CMS收集算法 参考: 图解 CMS 垃圾回收机制原理,-阿里面试题 G1收集算法 参考: G1 垃圾收集器入门 首先要知道 Stop the world的含义(网易面试):不管选择哪种GC算法,stop-the-world都是不可避免的。 Stop-the-world 意味着从应用中停下来并进入到GC执行过程中去。一旦Stop-the-world发生, 除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务 。GC调优通常就是为了改善stop-the-world的时间 CMS收集器是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“”标记--清除”(Mark-Sweep)算法实现的,整个过程分为四个步骤: 1. 初始标记 (Stop the World事件 CPU停顿, 很短) 初始标记仅标记一下GC Roots能直接关联到的对象,速度很快; 2. 并发标记 (收集垃圾跟用户线程一起执行) 初始标记和重新标记任然需要“stop the world”,并发标记过程就是进行GC Roots Tracing的过程; 3. 重新标记 (Stop the World事件 CPU停顿,比初始标记稍微长,远比并发标记短)修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些