jvm

【转】成为Java顶尖程序员 ,看这10本书就够了

霸气de小男生 提交于 2020-03-02 04:17:21
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:   1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料   2.对着书上的代码自己敲的时候方便   “看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。   很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。   首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life。   目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是:   1、随便开篇点明该设计模式的定义   2、图文并茂讲解该设计模式中的结构   3、以详细的代码形式写一下该种设计模式的实现   4、补充内容   5、讲解该设计模式的优缺点  

Java虚拟机详解01----初识JVM

 ̄綄美尐妖づ 提交于 2020-03-02 03:52:35
主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一、JVM的概念: JVM:   Java Virtual Machine,意为Java虚拟机。 虚拟机:   指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统 有哪些虚拟机: VMWare、Virtual Box:都是使用软件模拟物理CPU的指令集 JVM:使用软件模拟Java 字节码的指令集 二、JVM发展历史: 1、Java发展史: 1996年:SUN JDK 1.0 Classic VM     纯解释运行,使用外挂进行JIT 1997年:JDK1.1 发布     AWT、内部类、JDBC、RMI、反射 1998年:JDK1.2 Solaris Exact VM     JIT 解释器混合     Accurate Memory Management 精确内存管理,数据类型敏感     提升了GC性能     注:JDK1.2开始,称为Java 2,于是有了J2SE J2EE J2ME 的出现,同时加入Swing Collections。 2000年:JDK 1.3,Hotspot 作为默认虚拟机发布     加入JavaSound 2002年:JDK 1.4【Java真正走向成熟的一个版本】,Classic VM退出历史舞台     加入:Assert

多线程进阶——JUC并发编程之Synchronized底层实现概论🔥

 ̄綄美尐妖づ 提交于 2020-03-02 01:07:17
1、Synchronized简介 Java中提供了两种实现同步的基础语义: synchronized 方法和 synchronized 块 ,下面我们来操作一番: public class SyncTest { public void syncBlock(){ synchronized (this){ System.out.println("sync block balabala...."); } } public synchronized void syncMethod(){ System.out.println("sync method hahaha...."); } public static void main(String[] args) { } } 将SyncTest.java 编译为SyncTest,.class文件,我们使用 javap -v SyncTest.class 查看class文件对应的JVM字节码信息。这里我使用的是JVM版本是JDK1.8。 { ... public void syncBlock(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=3, args_size=1 0: aload_0 1: dup 2: astore_1 3: monitorenter 4:

为解压版的Tomcat创建一个窗口服务(修正版)

旧时模样 提交于 2020-03-02 00:03:44
一,配置环境变量 1, 把JDK安装到C:\ Program Files文件\的Java \ jdk1.6.0, 下载免安装版tomcat6.0(Tomcat的邮编)压缩包, 把Tomcat的解压放到C:\ Tomcat6.0下 2, 添加系统环境变量: JAVA_HOME = C:\ Program Files文件\的Java \ jdk1.6.0 CLASSPATH =.;%JAVA_HOME%\ lib中 TOMCAT_HOME = C:\ Tomcat6.0 修改系统环境变量PATH,在它的最前面加入: %JAVA_HOME%\ BIN; 注:放在最前面是预防有其它的JDK或JRE路径占先,如你装了甲骨文就会有一个低版本的JRE。 二配置Tomcat的启动环境 ( 注意,如果已经象前面那样设置过了,这里就可以跳过了) 1,修改的startup.bat文件: 在第一行前面加入如下两行 - SET JAVA_HOME = JDK目录 SET CATALINA_HOME =前面解压后的Tomcat的目录 片段如下: @ ECHO OFF SET JAVA_HOME = C:\ Program Files文件\的Java \ jdk1.6.0 SET CATALINA_HOME = C:\ Tomcat6.0 REM授权给Apache软件基金会(ASF)根据一个或多个

JVM详解

◇◆丶佛笑我妖孽 提交于 2020-03-01 23:39:44
JVM详解 JVM详解 1、JVM 运行时数据区 2、方法区 3、堆内存: 4、虚拟机栈: 5、java程序运行过程(例子): 6、JVM 知识图谱: 1、JVM 运行时数据区 线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁 2、方法区 作用:存储加载的类信息、常量、静态变量、JIT编译后的代码等数据。 GC:方法区存在垃圾回收,但是回收效率低 回收主要针对常量池的回收,和类型的卸载; 当方法区无法满足内存需求时,报OOM. 3、堆内存: 作用:唯一的目的就是存放对象实例,几乎所有的对象、数组都在这里存放。 对于大多数应用来说,堆是JVM管理的内存中最大的一块内存区域,也是最容易OOM的区域。 大多数JVM都将堆实现为大小可扩展的(通过-Xmx、-Xms控制)。 对象何时被回收:引用计数器算法(存在两个对象相互引用的问题) 可达性分析算法:主流的商用程序语言(java)都是通过可达性分析算法来判定对象是否存活, GC Roots可以是:虚拟机栈、方法中静态属性引用的对象、方法区中常量引用的对象,Native方法引用对象、 4、虚拟机栈: 线程中方法执行的模型,每个方法执行时,就会在虚拟机中创建一个栈帧,每个方法从调用到执行的过程,就对应着栈帧在虚拟机栈中从入栈到出栈的过程。 本地方法栈

JVM技术点速记 | 垃圾收集与内存分配

无人久伴 提交于 2020-03-01 23:00:12
1.1. 垃圾标记方法 引用计数 可达性分析 1.2. 垃圾收集方法 标记-清除 标记对象后统一回收,存在回收效率和内存碎片的问题。 标记-复制 将存活对象统一移动到另一部分内存空间里去,问题是内存可用率降低。 标记-整理 移动存活对象向空间的某一端然后释放边界外空间,问题是计算负担较大。 1.3. 垃圾收集器 Serial :早期新生代垃圾收集器,简单高效内存消耗小但是存在停顿时间长的问题。 ParNew :Serial收集器的多线程版本 Parallel Scavenge : 基于标记-清除的多线程新生代收集器。相比于ParNew增加了吞吐量控制(即保证垃圾收集时间与用户代码执行时间等于某个比例)。 Parallel Old :Parallel Scavenge的老年代版本,基于标记-整理。 CMS :通过初始标记、并发标记、重新标记、并发清除四个步骤降低停顿时间,其中并发标记和并发清除不需要停顿用户线程,重新标记是用来修正并发标记期间多线程导致的标记对象变动。 G1(Garabge First) : 将java堆划分成多个大小相等的Region,通过优先级列表以实现最高效回收。相比CMS,G1更接近“标记-整理”算法。 Shenandoah :支持并发标记、并发回收、并发引用更新,具有比G1更好的性能。 ZGC :使用染色体指针(Colored Pointer

3 -【 JVM - 动态字节码技术 】

余生颓废 提交于 2020-03-01 22:54:27
1 字节码技术应用场景 AOP 技术 Lombok 去除重复代码插件 动态修改 class 文件等 2 字节技术优势 Java 字节码增强指的是在 Java 字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java 字节码增强主要是为了减少冗余代码,提高性能等。 实现字节码增强的主要步骤为: 修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的 byte[] 数组,得到一个新的 byte 数组。 使修改后的字节码生效 有两种方法: 1) 自定义 ClassLoader 来加载修改后的字节码; 2)替换掉原来的字节码:在 JVM 加载用户的 Class 时,拦截,返回修改后的字节码;或者在运行时,使用 Instrumentation.redefineClasses 方法来替换掉原来的字节码 3 常见的字节码操作类库 3.1 BCEL Byte Code Engineering Library (BCEL),这是 Apache Software Foundation 的 Jakarta 项目的一部分。 BCEL 是 Java classworking 广泛使用的一种框架,它可以让您深入 jvm 汇编语言进行类库操作的细节。 BCEL 与 javassist 有不同的处理字节码方法, BCEL

Jvm 垃圾回收机制

僤鯓⒐⒋嵵緔 提交于 2020-03-01 22:47:09
判断一个对象是否可回收? 引用计数: 每当一个对象被引用时,其引用计数加一,当引用计数为0时GC回收内存将对象销毁。 缺点:无法回收互相引用的对象(互相调用其引用数永远不为0) 根可达算法 垃圾回收算法: 标记-整理算法: 适用于回收率低的区域 标记存活对象,将所有的存活对象压缩到内存的另一端。之后清理边界之外的所有空间。 复制算法:适用于回收率高的区域 将内存分为两半,每次只是用一半的内存,回收时将正在使用的内存中的存活的对象复制到另一半中,再清理内存。 在Hotsop虚拟机中的垃圾回收算法: 分代回收机制:将内存分为新生代和老年代,其中的新生代分为eden、幸存者区域(from和to),老年代(Old)。新生代:幸存者=8:1 在新生代中采用复制算法,每次只使用幸存者区域的一块,在回收时将eden和使用的一块幸存者区域存活的对象复制到另一块幸存者区域中,再清理,如果另一块幸存者区域放不下就进入老年代。 在老年代采用标记整理算法,将存活对象压缩内存的一边,清理另一边内存。 HotSpot启动回收时机: HotSpot采用根可达算法,在确定Root节点时需要停止所有线程的执行,在HotSpot中在解析代码时会将引用保存到一个OopMap数组中,以便虚拟机方便找到引用的区域。 在GC时不能有引用关系的变化,又不能频繁保存更新OopMap,HotSpot在代码中设置安全点

深入剖析Classloader(一)--类的主动使用与被动使用

时光总嘲笑我的痴心妄想 提交于 2020-03-01 21:28:25
原文地址: http://yhjhappy234.blog.163.com/blog/static/3163283220115573911607 我们知道 java 运行的是这样的,首先 java 编译器将我们的源代码编译成为字节码,然后由 JVM 将字节码 load 到内存中,接着我们的程序就可以创建对象了,我们知道 JVM 将字节码 load 到内存之后将将建立内存模型( JVM 的内存模型我们将在稍后阐述),那 JVM 是怎么将类 load 到内存中的呢?对了,是通过 Classloader ,今天我们就来深入探讨一下 Classloader 。 首先我们来看一段诡异的代码(一段单实例测试代码)。 package com.yhj.jvm.classloader; /** * @Description:单例初始化探究 * @Author YHJ create at 2011-6-4 下午08:31:19 * @FileName com.yhj.jvm.classloader.ClassLoaderTest.java */ class Singleton{ private static Singleton singleton=new Singleton(); private static int counter1; private static int counter2 = 0;

JVM垃圾回收算法于垃圾回收器

。_饼干妹妹 提交于 2020-03-01 20:35:31
GC如何判断对象是否存活 引用计数算法 可达性分析 引用计数器: 给对象添加一个引用计数器,当对象添加一个引用时计数器加1,引用失效时计数器减1,。引用计数为0的对象可被回收。 优点:快,方便,实现简单。 缺点:对象相互引用时(A.instance-B 同时 B.instance=A),很难判断是否该回收。 可达性分析: 该算法根据“GC Roots”的对象作为起点,向下搜索,其路径为引用连(Reference Chain),某对象没有任何引用链时,则证明该对象不可用。 GC Roots的对象包括: 当前虚拟机栈中局部变量表中的引用的对象 当前本地方法栈中局部变量表中的引用的对象 方法区中类静态属性引用的对象 方法区中的常量引用的对象 finalize :虽然可以完成对象拯救,但是JVM不一定会执行,是个“坑”。 各种引用 强引用 = 软引用 SoftReference 弱引用 WeakReference 虚引用 PhantomReference 强引用 :Object obj=new Object(),就是强引用 软引用 :内存充足是不会回收,内存不足时会回收,适用于缓存,一些有用但非必须的对象,进行OOM之前,就会被回收。 弱引用 :无论内存是否充足,都会被回收。例如:ThreadLocal、weakHashMap 虚引用 :最弱,和没有引用一样 GC (Garbage