![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 88
ShadowfaxGHH
Shadowfax, He is the lord of all horses...
展开
-
流程概述:编译、装载、执行
【参考链接】走进 Javahttp://wiki.jikexueyuan.com/project/java-vm/overwise.htmlJava代码编译和执行的整个过程http://wiki.jikexueyuan.com/project/java-vm/java-debug.html 从编写Java源代码,到运行Java程序,大体上会经历3个阶段:编译、加载、执行原创 2017-10-31 09:57:20 · 2187 阅读 · 0 评论 -
栈内存状态变化概述
【参考链接】实例分析Java代码运行时内存布局http://blog.csdn.net/wangyy130/article/details/52100907运行时数据区http://blog.csdn.net/u012440687/article/details/52021393 1、栈帧的顺序画反了2、这里都是通过参数进行数据传递,主要是在操作局部变量表,如果通过对象的成员变原创 2017-11-30 23:57:39 · 2566 阅读 · 0 评论 -
对象内存模型[0]
【参考链接】java对象的内存布局http://blog.csdn.net/aitangyong/article/details/46416667一个Java对象到底占用多大内存?http://www.cnblogs.com/magialmoon/p/3757767.html 前面在描述内存状态变化时,堆内存只是简单的以一个方块来代替那实际上堆内存是怎样的呢? 本原创 2017-11-30 23:59:19 · 2218 阅读 · 0 评论 -
对象内存模型[1]String
【参考链接】 一个String对象在堆上占用几个字节虽然String对象所代表的字符串可能是多种多样的,但是一个String对象在堆内存中所占用的内存空间大小是固定的,这是因为为了节省内存空间,一个应用程序中,所有的字符串常量都集中、不重复的保存在一个表中,这个表叫做字符串“拘留表”。一个String类型内部包含如下两个成员变量:char[],字符数组,本质是个引用,指原创 2017-12-01 00:00:48 · 2221 阅读 · 0 评论 -
反射[0]获取不同类型的Class对象
在加载阶段,对于任意一个类,都会在堆上生成一个Class类型的对象。通过这个对象可以获取这个类的结构信息。可以通过如下4种方式获取这个Class对象ClassLoader.load();String.class;Class.forName();str.getClass();其中反射时最常用的是Class.forName()。 1、一个类只有一个Class类型的对原创 2017-03-06 12:39:10 · 2233 阅读 · 0 评论 -
对象内存模型[2]内部类
【参考链接】Java内部类详解http://www.cnblogs.com/dolphin0520/p/3811445.html静态内部类和非静态内部类的区别http://www.cnblogs.com/dolphin0520/p/3811445.html为什么Java内部类要设计成静态和非静态两种?https://www.zhihu.com/question/28197253 内部类分为静态内...原创 2018-04-18 09:56:25 · 756 阅读 · 1 评论 -
对象内存模型[3]线程
【参考链接】 我们在启动线程的时候,也经常使用匿名内部类的方式,那么此时内存的状态是怎样的呢?以如下代码为例 已经加了断点,在Eclipse中启动调试,两个线程都停在了加断点的地方 在main线程中,有main()方法的栈帧,其中有两个局部变量,String[0]类型的args和Test类型的t。 (因为main()方法是静态的,所以没有局部变量this) 在Thread-0线程中,有匿名内部...原创 2018-04-18 09:59:33 · 191 阅读 · 0 评论 -
堆内存:划分、识别垃圾对象、分配策略和回收时机
【参考链接】Java 垃圾收集机制http://wiki.jikexueyuan.com/project/java-vm/garbage-collection-mechanism.html 划分堆内存划分为新生代和老年代,新生代又分为eden和survivor(伊甸园和幸存者),survivor又分为大小相同的两块from和to。 ...原创 2018-04-18 10:05:50 · 413 阅读 · 0 评论 -
内存溢出
【参考链接】内存溢出http://wiki.jikexueyuan.com/project/java-vm/storage.html 当某一块内存空间不够用时,就会出现内存溢出前面我们知道,虚拟机的内存空间可以分为方法区、栈、堆没有提供方式来设置整个虚拟机内存的大小对于方法区在Java1.8之前又可称为永久区,可以使用-XX:PermSize和-XX:MaxPermSize来指定在java1.8...原创 2018-04-18 10:08:33 · 179 阅读 · 0 评论 -
虚拟机启动参数
启动Java虚拟机时,可以为其设置启动参数在命令行中,通过如下方式来设置java[-options] classfile在Eclipse中,通过如下方式来设置(新建或运行一次以后再设置)此外从上面还可以看出还可以设置传递给main()方法的参数,这里不再赘述。 常用的参数如下加载-Xbootclasspath/a:D:/temp、-Xbootclasspath/p:D:/temp将D:/temp...原创 2018-04-18 10:12:54 · 1188 阅读 · 0 评论 -
[0]Runtime.memory()
可以使用Runtime来获取到当前程序内存空间的状态如下代码所示 Java Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 //-Xms16M -Xmx20M -Xmn8m -XX:SurvivorRatio=...原创 2018-04-18 10:14:17 · 258 阅读 · 0 评论 -
[1]System.gc()
System.gc()会触发FullGC,回收新生代、老年代。(还有方法区)以如下代码为例 Java Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //-Xms16M -Xmx16M -Xmn8m -XX:SurvivorRatio=2 -XX:+PrintHeapAtG...原创 2018-04-18 10:15:21 · 330 阅读 · 0 评论 -
NDK[0]jni
【参考链接】Windows下使用Java Jni调用C/C++初探http://blog.csdn.net/pxhero2012/article/details/52926082 JNI的作用是在Java代码中调用C/C++代码编写的动态库。在Windows系统上,C/C++动态库的格式是.dll,在Linux/Android等系统上,C/C++动态库的格式是.so。本文以Windows系统下的J...原创 2018-04-18 10:22:57 · 296 阅读 · 0 评论 -
NDK[1]ndk、ADT、AndroidStudio
【参考链接】向您的项目添加 C 和 C++ 代码https://developer.android.com/studio/projects/add-native-code.htmlAndroidStudio 2.2 CMAKE 高效NDK开发http://m.blog.csdn.net/l_215851356/article/details/74691147AndroidStudio进行 JNI ...原创 2018-04-18 10:28:08 · 338 阅读 · 0 评论 -
字节码指令
下面会指令族的概念,先说明一下前缀x取值含义iintbbyteccharsshortllongffloatddouble原创 2017-11-30 23:55:04 · 2465 阅读 · 0 评论 -
类加载器[4]由不同ClassLoader对象加载的同名类属于不同类
由不同ClassLoader加载的同名类属于不同的类型,不能相互转化和兼容。新建一个工程NotSameClass。将如下代码,一份放入NoSameClass工程源代码目录下,一份编译成.class放入D:\temp目录下运行如下代码,使用不同的类加载器加载同一个类(源代码都一样,不过一个来自bin目下的.class,一个来自D:\temp下的.class) Java Code原创 2017-03-06 15:49:36 · 7838 阅读 · 5 评论 -
类加载器[3]自定义类加载器[2]:URLClassLoader
【参考资料】分析AppClassLoader,ExtClassLoader和URLClassLoader的关系http://blog.csdn.net/irelandken/article/details/7046689 在自定义类加载器中,我们自定义了一个CustomClassLoader用于从D:\temp目录下读取.class文件但是实际上JDK已经给我们提供了URLCl原创 2017-03-06 15:46:54 · 2809 阅读 · 0 评论 -
class文件结构[0]
.java源代码文件经过编译以后会生成.class字节码文件。可以使用WinHex直接以十六进制形式查看也可以使用javap命令和jclasslib软件(注意64位操作系统匹配,和版本不要太低,我使用低版本的时候出现过字节码指令显示错误的问题) 后面讲解的时候,不打算详细到具体字节所以主要通过javap命令和jclasslib软件。这两个方式的展示各有优缺,后续展示常量池的时候原创 2017-10-31 09:59:26 · 2189 阅读 · 0 评论 -
class文件结构[1] 编译前预处理
1. 如果一个类没有显式继承自Object,则会自动为其加上继承自Object以如下代码为例 Java Code 1234 package com.test.a;public class Test {} 2. 在创建一个对象时,必须先创建他的父对原创 2017-10-31 10:02:16 · 2313 阅读 · 0 评论 -
class文件结构[2] static final、static、final、普通类型成员变量的赋初值
不考虑作用域修饰符,成员变量的类型有:static final 类型、仅static类型、仅final类型、普通类型并且,我们在定义成员变量的时候,还可以通过=赋初值。(其中包含final时强制要求赋初值)那么,这些赋值操作都是在哪个阶段完成的呢? 按照执行的先后顺序1. 对于staticfinal类型成员变量,会在class文件的Fields中增加Const原创 2017-10-31 10:07:59 · 2552 阅读 · 1 评论 -
class文件结构[3] 常量池
【参考链接】《Java虚拟机原理图解》 1.2、class文件中的常量池http://blog.csdn.net/luanlouis/article/details/40148053《Java虚拟机原理图解》1.2.2、Class文件中的常量池详解(上)http://blog.csdn.net/luanlouis/article/details/39960815《Java虚拟机原理原创 2017-10-31 10:16:09 · 361 阅读 · 0 评论 -
class文件结构[4]
【参考链接】深入理解Java Class文件格式(三)http://blog.csdn.net/zhangjg_blog/article/details/21557357深入理解Java Class文件格式(四)http://blog.csdn.net/zhangjg_blog/article/details/21658415深入理解Java Class文件格式(五)http://bl原创 2017-10-31 10:25:20 · 2205 阅读 · 0 评论 -
class文件结构[5] 局部变量表的槽位复用及其对垃圾回收的影响
long、double类型在局部变量表中需要占用2个槽位其他类型如int、引用类型需要占用1个槽位 非static的成员方法的第一个局部变量都是this引用 以上一节的例子为例一共占用5个槽位,其中D(double)类型的arg1占用2槽位,其余各占用1个槽位。 局部变量表中的槽位是可以复用的如果一个局部变量过了其作用范围,那么在其作原创 2017-10-31 10:35:04 · 2995 阅读 · 1 评论 -
类加载器[1]getClassLoader
可以通过ClassLoader.getSystemClassLoader()获取应用类加载器也可以通过Class.getClassLoader()获取具体某个类的类加载器,即该类是有哪个类加载器加载的(本质是哪个类加载器调用了defineClass()方法)。他们之间符合默认的父类委托机制。 JavaCode public class PrintCl原创 2017-03-06 14:29:01 · 2277 阅读 · 0 评论 -
类加载器[0]内置类加载器
JVM提供了如下4个层次的类加载器:1、引导类加载器用于加载JAVA_HOME/jre/lib/rt.jar.他并不继承自java.lang.ClassLoader,是用C/C++代码实现的。 2、扩展类加载器用于加载JAVA_HOME/jre/lib/ext/*.jar具体实现为sun.misc.Launcher$ExtClassLoader原创 2017-03-06 14:33:59 · 2432 阅读 · 0 评论 -
类加载器[2]父类委托机制[0]
java.lang.ClassLoader中的loadClass()方法源码如下 JavaCode protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getCla原创 2017-03-06 14:43:52 · 2259 阅读 · 0 评论 -
类加载器[2]父类委托机制[2]父类委托机制真的安全吗
基本上网上搜索的资料都是说,采用父类委托机制的优点是安全,它可以保证,不能自己随便写一个String类来动态替代java核心库中的String类,因为String会在引导类加载器时就被加载上。 但是这种安全是建立在不改变加载顺序的基础上的。以上面的String为例,我们自己写一个java.lang.String类。在eclipse中,如果工程中存在java.lang.String.原创 2017-03-06 15:31:06 · 2372 阅读 · 0 评论 -
类加载器[2]父类委托机制[1]
下面通过一系列实验来加深对父类委托机制的理解。(首先新建一个Java工程ClassLoaderOrder) 有如下两个Hello.java文件,分别生成.class文件。app版本放到ClassLoaderOrder工程的bin目录下,boot版本放到D:\temp目录下 Java Code package com.bjsxt.test;原创 2017-03-06 15:27:18 · 2297 阅读 · 0 评论 -
类加载器[3]自定义类加载器[0]
在遵循父类委托机制的情况下,要实现自己的类加载器,只需要继承ClassLoader并重写他的findClass()方法。原理参见”父类委托机制[0]”章节。 现将如下源代码编译成.class文件,把com\bjsxt\test\HelloLoader.class放到D:\temp目录下 Java Code package com.bjsxt.test;原创 2017-03-06 15:38:01 · 2260 阅读 · 0 评论 -
类加载器[3]自定义类加载器[1]:突破父类委托机制
如果要突破父类委托机制,需要重写loadClass()方法。如下的例子,当遇到某个类名的时候,会先自己尝试加载,如果自己加载不到,再交由父加载器加载。 Java Code package com.bjsxt.test;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;原创 2017-03-06 15:44:14 · 2517 阅读 · 0 评论 -
NDK[2]Java方法到C方法 和 C方法到Java方法
【参考链接】 程序运行时,以主线程的main()方法为入口,不停的从一个方法调用到另一个方法中,方法返回再继续调用其他的根据之前JVM的知识,其实就是在不停向栈中压入栈帧、弹出栈帧所以既可以在java方法中调用C/C++方法,也可以在C/C++方法中调用Java方法,只不过这两种栈是分开维护的。 Java方法到C/C++方法给一个类定义一个native方法,实现其对应的C/C++方法,在Java中...原创 2018-04-18 10:30:38 · 302 阅读 · 0 评论