jvm
Coding-lover
Keep hungry,Keep foolish(可通过微信联系我:unilay_yang)
展开
-
java ClassLoader加载资源
加载资源可以用绝对路径和相对路径,但都有局限性。用硬编码的方式不好。 比较好的方式是绝对+相对方式。即绝对路径就是应用程序安装的路径,相对路径是资源文件相对于程序根目录的路径。 java.lang.ClassLoader不仅可以加载类到内存中,还可以加载其它的资源。 1. ClassLoader.getResourceAsStream 比方说配置文件,很多时候都是放转载 2014-12-10 21:52:45 · 673 阅读 · 0 评论 -
java 理解Java ClassLoader机制
当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader | extension classloader | system classloaderbootstrap classloader -引导(转载 2014-11-03 00:18:43 · 810 阅读 · 0 评论 -
java JVM 运行时数据区
原文链接: JVM Run-Time Data Areas参考地址: JVM运行时是什么样子?这是阅读JVM规范时的笔记, 我画了一幅图来帮助自己加深理解:图1 JVM运行时数据区1. 单线程数据区(非共享)从上图可以看出,每个线程都有自己独立的数据区,包括 PC(程序计数器),JVM(方法)栈,以及本地方法栈. 当创建新线程时,这些数据区域将会一并创建.转载 2014-10-22 22:06:51 · 615 阅读 · 0 评论 -
java 类加载器的工作原理
Java类加载器的作用就是在运行时加载类。Java类加载器基于三个机制:委托、可见性和单一性。委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。正确理解类转载 2014-07-28 22:02:43 · 861 阅读 · 0 评论 -
AOP 的利器:ASM 3.0 介绍
引言什么是 ASM ?ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从转载 2015-02-01 16:08:36 · 782 阅读 · 0 评论 -
javassist 学习笔记
介绍:www.javassist.org/javassist、ASM 对比1、javassist是基于源码级别的API比基于字节码的ASM简单。2、基于javassist开发,不需要了解字节码的一些知识,而且其封装的一些工具类可以简单实现一些高级功能。比如HotSwaper。3、ASM比javassist性能更快,灵活行也较高。4、javassist提供者动态代理接转载 2015-02-02 23:31:05 · 957 阅读 · 0 评论 -
使用 ASM 实现 Java 语言的“多重继承”
问题的提出在大部分情况下,需要多重继承往往意味着糟糕的设计。但在处理一些遗留项目的时候,多重继承可能是我们能做出的选择中代价最小的。由于 Java 语言本身不支持多重继承,这常常会给我们带来麻烦,最后的结果可能就是大量的重复代码。本文试图使用 ASM 框架来解决这一问题。在扩展类的功能的同时,不产生任何重复代码。考虑如下的实际情况:有一组类,名为 SubClass1、SubClas转载 2015-02-01 16:55:33 · 1127 阅读 · 0 评论 -
javassist 简介
要想将编译时不存在的类在运行时动态创建并加载,通常有两种策略:1. 动态编译2. 动态生成二进制字节码(.class)对于第二种策略,实际上已经有诸多比较成熟的开源项目提供支持,如CGLib、ASM、Javassist等。这些开源项目通常都具备两方面的功能:1. 动态创建新类或新接口的二进制字节码2. 动态扩展现有类或转载 2015-02-02 23:34:20 · 760 阅读 · 0 评论 -
java 字节码增强之ASM
ASM系列之一:初探ASM一、什么是ASM ASM是一个JAVA字节码分析、创建和修改的开源应用框架。在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法。与传统的BCEL和SERL不同,在ASM中提供了更为优雅和灵活的操作字节码的方式。目前ASM已被广泛的开源应用架构所使用,例如:Spring、Hibernate等。二、ASM能干什么 分转载 2015-02-01 13:10:40 · 6574 阅读 · 0 评论 -
java java.lang.instrument 学习
Instrumentation介绍:java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。 Java SE5中使用JVM TI替代了JVM PI和JVM DI。提供一套代理机制,支持独立于JVM应用程序之外的程序以代理的方式连接和访问JVM。In转载 2015-02-01 23:23:30 · 645 阅读 · 0 评论 -
java JVM的体系结构 内存模型
按照官方的说法:Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。在JVM中堆之外的内存称为非堆内存。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所有方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时转载 2014-07-12 16:35:54 · 811 阅读 · 0 评论 -
jvm 参数调优
PE2950 8G 双cpu,每cpu四核,raid1,两个tomcat6.0.14JAVA_OPTS='-server -Xms2560m -Xmx2560m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -Xss256k -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+U转载 2015-02-03 22:44:56 · 758 阅读 · 0 评论 -
jvm 对象访问
对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。如下面这句代码:Object objectRef = new Object(); 假设这句代码出现在方法体中,"Object objectRef” 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而“new Object()”这部分将会反映到Java堆中,形成一块存转载 2015-02-03 20:00:41 · 580 阅读 · 0 评论 -
jvm 打印所有XX参数及值
本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。-XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial让我们现在就了解一下新参数的输出。以 -client 作为参数的 -XX:+PrintFlagsFinal 的结果是一个转载 2015-02-03 22:03:41 · 7035 阅读 · 0 评论 -
jvm 日志和参数的理解
写这篇wiki的目的:最近在调整Hbase的JVM,翻了些文档和wiki,想写点东西,给自己和想了解jvm日志和参数的同 学提供些帮助. 一:理解GC日志格式,读GC日志的方法1:开启日志-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps-Xloggc:/path/gc.log-X转载 2015-02-03 20:23:33 · 784 阅读 · 0 评论 -
jvm 5.0中调配Garbage Collection
1.简介2.Ergonomics(工效学)3.Generations(辈分) 3.1性能考虑 3.2测量4.调整各Generation的容量 4.1 Heap总量 4.2 Young Generation 4.2.1 Young Generation Guarantee(Young Generat转载 2015-02-03 21:06:20 · 1179 阅读 · 0 评论 -
java 6 JVM参数选项大全(中文版)
作者:Ken WuEmail: ken.wug@gmail.com转载 原文请猛击 这里 本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Options 编写的译文。主要介绍JVM中的非稳态选项及其使用说明。为了让读者明白每个选项的含义,作者在原文基础上补充了大量的资料。希望这份文档,对正在研究JVM参数的朋友有帮助!转载 2015-02-03 21:48:15 · 943 阅读 · 0 评论 -
java 深入理解JVM--JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构。于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢?1960年 基于MIT的Lisp首先提转载 2014-07-14 20:33:08 · 1697 阅读 · 0 评论 -
java 对象大小
对象内存大小度量在做内存优化时,需要知道每个对象占用的内存的大小,一个实例化的对象在内存中需要存储的信息包括:对象的头部(对象的GC信息,hash值,类定义引用等)对象的成员变量: 包括基本数据类型和引用。 如成员变量是一个引用, 引用了其他对象,被引用的对象内存另外计算。如下一个简单的类的定义:class MyClass { int a;转载 2015-02-12 00:49:55 · 689 阅读 · 0 评论 -
java 对象内存结构
学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C++中的这个操作符对于指针运算、内存拷贝和IO操作都非常有用。Java中并没有一个类似的运算符。事实上,Java也不需要这种运算符。Java中基本类型的大小在语言规范中已经定义了,而C/C++中基本类型大小则跟平台相关。Java转载 2015-02-12 00:57:45 · 596 阅读 · 0 评论 -
java 各种类型对象的堆空间占用
优化应用程序代码的内存使用并不是一个新主题,但是人们通常并没有很好地理解这个主题。本文将简要介绍 Java 进程的内存使用,随后深入探讨您编写的 Java 代码的内存使用。最后,本文将展示提高代码内存效率的方法,特别强调了 HashMap 和 ArrayList 等 Java 集合的使用。背景信息:Java 进程的内存使用参考知识如需进一步了解 Java 应用程序的转载 2015-02-11 21:27:02 · 1631 阅读 · 0 评论 -
java OutOfMemoryError简单分析
Java之OutOfMemoryError简单分析 最近编码遇到了Java内存溢出的问题,所以就想顺便总结一下几种导致Java内存溢出的栗子,以及碰到Java内存溢出要如何去解决。Java堆溢出 Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达的路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆容量限制之后就会产生内转载 2014-12-15 00:34:52 · 655 阅读 · 0 评论 -
javap -c命令详解
一直在学习Java,碰到了很多问题,碰到了很多关于i++和++i的难题,以及最经典的String str = "abc" 共创建了几个对象的疑难杂症。 知道有一日知道了java的反汇编 命令 javap。现将学习记录做一小结,以供自己以后翻看。如果有错误的地方,请指正1.javap是什么: where options include:-c Disassemble th转载 2014-11-23 21:27:16 · 769 阅读 · 0 评论 -
java JVM的内存区域(运行时数据区域)
JVM的内存形式: (1)方法区:存放了要加载的类的信息(名称,修饰符等)、类中的静态变量、类中定义为final的变量、类中Field信息、类中的方法信息,当开发人员通过Class对象的getName、isInterface方法来获取信息时候,这些信息都来源于方法区。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其运行的大小时,会抛出OutOfMemory信息转载 2014-07-03 00:19:01 · 1549 阅读 · 1 评论 -
java 三种GC大揭秘
(本文基于JDK6) 说到GC,首先要对Java 的内存模型有所了解。Java 的内存模型各个代的默认排列有如下图(适用JDK1.4.* 到 JDK6):Java 的内存模型分为Young(年轻代)Tenured(终身代)Perm(永久代) 更多关于内存模型的文章看这里:图解JVM在内存中申请对象及垃圾回转载 2014-07-12 15:54:34 · 809 阅读 · 0 评论 -
java jvm类加载器-父亲委托机制实例分析
类加载器的父亲委托机制(Parent Delegation) 类加载器用来把类加载到java虚拟机中。从JDK1.2开始,类的加载过程采用父亲委托机制。这种机制能更好的保证java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类时,loader1首先委托转载 2014-09-20 15:52:49 · 846 阅读 · 0 评论 -
java 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢一点儿. 由于内存的发展都到技术及成本的限制, 现在获取内存中的一条数据大概需要200多个CP转载 2014-12-06 23:44:45 · 841 阅读 · 0 评论 -
java 深入探讨 Java 类加载器
类加载器(class loader)是 Java™中的一个很重要的概念。类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™中的应用。转载 2014-11-02 21:48:06 · 630 阅读 · 0 评论 -
java javac编译与JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现。很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目转载 2014-10-27 23:05:53 · 1172 阅读 · 0 评论 -
java Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各转载 2014-10-29 23:34:32 · 984 阅读 · 0 评论 -
Java堆内存的10个要点
摘要:对大多数程序员都经历过这样的过程,因为学习一种语言是非常容易来的,但是学习基础是非常难的,因为没有什么特定的流程让你学习编程的每个基础,使你发觉编程的秘诀。 导读:对于程序员来说,知道堆空间,设置堆空间,处理堆空间的outOfMemoryError错误,分析heap dump是非常重要的。文中介绍了Java堆的学习教程以及Java堆内存(heap memory)的十个要点。文章内原创 2012-11-13 22:29:29 · 725 阅读 · 0 评论 -
java 内存模型(堆和栈的区别)
Java把内存分为栈内存和堆内存。两者的主要区别是: 栈内存堆内存 存放内容(1)在函数中定义的基本类型变量(2)在函数中定义的对象的引用变量 new产生的对象和数组 回收方式自动回收:在函数体(即在{}之内)中定义的变量,如果超过了函数体,将自动转载 2014-07-03 00:16:17 · 1935 阅读 · 0 评论 -
java 图解JVM内存模型
Java 的内存模型由3个代组成,各个代的默认排列有如下图(适用JDK1.4.* 到 JDK6):Java 的内存模型分为Young(年轻代)Tenured(终身代)Perm(永久代) 有些旧版本也叫作NewOldPerm 叫法不同,表达的意思却是基本相同。 注意Young(年轻代转载 2014-07-12 15:49:40 · 658 阅读 · 0 评论 -
java 内存泄露常见类型及对应相关JVM参数
昨天晚上启动jboss之后,发现点击某个页面,总是crash掉;控制台信息如下:----------------------------------------------------------------------------------------------------------------# # A fatal error has been detected by转载 2014-07-19 00:12:10 · 755 阅读 · 0 评论 -
java jvm类加载器-类加载实例分析
ClassLoader(类加载器)1、Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机将结束生命周期 –执行了System.exit()方法 –程序正常执行结束 –程序在执行过程中遇到了异常或错误而异常终止 –由于操作系统出现错误而导致Java虚拟机进程终止2、类的加载、连接与初始化转载 2014-09-20 14:48:04 · 646 阅读 · 0 评论 -
java 数组在内存中的结构
原文链接: What does a Java array look like in memory?Java中的数组存储两类事物: 原始值(int,char,...),或者引用(对象指针).当一个对象通过 new 创建,那么将在堆内存中分配一段空间,并且返回其引用(指针).对于数组,也是同样的方式.1. 一维数组转载 2014-10-22 22:14:42 · 700 阅读 · 0 评论 -
javap 浅析(实例分析)
3.2.1javap命令工具第1章中我们就提到了有些地方需要用javap命令工具来看编译后的指令是什么,第2.2.1节中胖哥使用了一个简单的程序让大家感受了一下javap命令工具是什么,这里再次谈到javap命令工具了。或许这一次我们可以对javap命令工具说得稍微清楚一点。为此,胖哥会单独再写几段小程序给大家说说javap命令工具的结果怎么看。胖哥为什么要给简单程序呢?为啥不直接转载 2015-01-25 11:37:57 · 2081 阅读 · 0 评论 -
jvm 实战OutOfMemoryError
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述:对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任。 对于Java程序员来说,不需要在为每一个new操作去写配对的delete/f转载 2015-02-12 23:31:43 · 911 阅读 · 0 评论 -
jvm 内存管理:深入垃圾收集器与内存分配策略
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项技术当做Java语言的伴生产物。事实上GC的历史远远比Java来得久远,在1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期,转载 2015-02-12 23:37:38 · 608 阅读 · 0 评论 -
java 常量池详解
在class文件中,“常量池”是最复杂也最值得关注的内容。 Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名; 字段的名称和描述符; 方法和名称和描述符。 在C转载 2014-07-13 23:23:49 · 826 阅读 · 0 评论