- 博客(129)
- 资源 (1)
- 收藏
- 关注
原创 C 函数值传递和指针传递的效率问题
C 函数值传递和指针传递的效率问题C中有两种传递,值传递和指针(地址)传递。值传递需要把数据的一份拷贝传递入函数形参表,并存储在栈中,函数返回后弹出栈,拷贝被删除。而指针传递则不然。如果形参表是指针,那么函数在执行时会直接去指针指向的地址中获取此数据并操作,而不用直接拷贝。看下这个例子:const int ARRAY_SIZE = 20;typedef struct{ long long
2016-05-14 17:02:21
2018
原创 Java GC 日志格式理解小结
Java GC 日志理解小结下面以一个典型的GC日志做分析:33.125: [GC[DefNew:3324K->152K(3712K), 0.0025925 secs]3324K->152K( 11904K), 0.0031680 secs]100.667: [FullGC[Tenured: 0 K->210K(10240K) , 0.0149142secs]4603K->210K( 19456K
2016-05-13 19:40:05
1696
原创 JVM的几种垃圾收集器
JVM的几种垃圾收集器Serial收集器基本原理:新生代收集器,采用标记复制算法它是一个单线程收集器,只会使用一个CPU和一条收集线程完成GC。缺陷:在于它“Stop-The-World”的收集方式。进行垃圾收集时必须暂停其他线程的所有工作优点:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做GC反而效率更高。适用场景
2016-05-13 17:20:02
809
原创 C strpbrk 查找任意几个字符
C strpbrk 查找任意几个字符头文件string.h函数原型char *strpbrk(char const *str, char const *group);返回的是字符集合group中任意字符在str中第一次出现的位置(最左面的)。同样,函数返回的是指向此位置字符的指针。注意事项注意匹配的是group中任意一个字符,而且区分大小写。看下代码就明了了:int main(){ cha
2016-05-13 11:15:46
718
原创 C strchr strrchr查找一个字符
C strchr strrchr查找一个字符头文件string.h函数原型char *strchr(char const *str, int ch);char *strrchr(char const *str, int ch);注意事项返回值的类型注意返回的不是一个整数index,而是一个指向字符的指针。看代码:int main(){ char *string = "abcde";
2016-05-13 11:04:43
1150
原创 C 可指定长度的字符串函数
C 可指定长度的字符串函数头文件string.h函数原型char *strncpy(char *dst, char const *src, size_t len);char *strncat(char *dst, char const *src, size_t len);int strcmp(const char *s1, const char *s2, size_t len);后面len可指
2016-05-13 10:46:55
1090
原创 C strcmp 字符串比较
C strcmp 字符串比较头文件string.h函数原型int strcmp(const char *s1, const char *s2);返回的是一个int。注意事项注意比较的结果是依照字典序确定的:如果 s1 < s2 ,也就是s1的字典序排在s2的前面,返回 -1如果 s1 = s2,也就是两者字典序相同,也就是为同字符串, 返回 0 如果 s1 > s2,也就是s1的字典序排在s
2016-05-13 09:38:58
1373
原创 C strcat
C strcat头文件string.h函数原型char *strcat(char *dst, const char *src);返回的是第一个参数dst的拷贝。用于拼接字符串。注意事项dst的空间约束dst必须有足够的空间保留之前已经有和要拷贝进来的字符串。正确的使用案例:#include<stdlib.h>#include<string.h>#include<stdio.h>char s
2016-05-13 09:17:33
820
原创 C strcpy
C strcpy头文件string.h函数原型char *strcpy(char *dst, const char *src);返回的是第一个参数dst的拷贝。注意事项dst的约束由于 dst 参数将进行修改,所以它必须是一个字符串数组或者一个指向动态分配内存的数组指针,不能是字符串常量,而且必须保证有足够的空间。代码举例:这样是可以的char *src = "***";char strin
2016-05-12 16:59:55
535
原创 C strlen
C strlen 返回值注意事项基础知识头文件string.h函数原型size_t strlen(char const *string);这个size_t是在头文件stddef.h中定义的,是一个unsigned long类型。注意事项注意它的返回值,是一个无符号整数类型(可能为unsigned int 或者 unsigned long)。下面的代码就会因此产生问题:/** * 两个无符号整型相减
2016-05-12 16:01:20
711
原创 C 数组基础知识分析
C 数组基础知识分析数组名含义一言以蔽之,数组名就是一个指向比其所在维度低一维的东西的指针。让我们再深入的分析一下一维数组比一维再低一维的就是元素。因此,一维数组名就是一个指向所存元素类型的指针。且其值为首元素地址。如果有 int a[10],那么这个a就是一个指向整型的指针,且指向首元素a[0],且其值等于&a[0]。多维数组比多维再低一维的还是数组。因此,多维数组就是一个指向低一维度的数组的指针
2016-05-12 11:22:21
588
原创 HotSpot GC 具体实现关键点概要
HotSpot GC 具体实现关键点概要GC roots 枚举过程枚举过程的困难点:范围大: GC roots主要在全局性的引用(常量与静态变量)和执行上下文(如栈帧中的本地变量表)。现在程序仅仅就方法区而言就很大,程序整体体积更是不用说。如果要注意检查这些引用,如查看所有栈帧中的本地变量表,那么时间上肯定是无法接受的。必须在快照中进行:在枚举过程中,不能出现程序运行。因为这会导致GC root
2016-05-05 10:12:24
1661
原创 Java 垃圾清理基础理论
Java 垃圾清理基础理论标记-清除算法基本原理先标记需要回收的对象,然后回收被标记的对象。标记过程标记过程(对象的死亡至少要经历两次标记):首先,如果发现对象从GC root出发不可达,那么就会被第一次标记并进行筛选。筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被执行过了,则会被判定为“没有必要执行”。在确定对
2016-05-05 09:56:11
605
原创 C 可变参数的使用
C 可变参数的使用C中的可变参数需要使用 stdarg.h 头文件。此头文件中声明了一个类型va_list和三个函数——va_start、va_arg 和 va_end。让我们先看一个求均值函数的实现,看看C中可变参数是如何使用的。样例代码#include <stdio.h>#include <stdlib.h>#include <stdarg.h>float average(int count
2016-05-04 17:52:07
650
原创 C ADT 的实现
C ADT 的实现C也可实现ADT。主要是利用static关键字。static可将被修饰者的作用域限定到文件中,此文件以外则不可对它进行访问。笔者这里实现了一个简单的链表,可以参考下:NameList.c#include<stdlib.h>#include<stdio.h>static const int MAX_PEOPLE_NUM = 100;static char* data[MAX_PE
2016-05-04 16:39:08
917
原创 JVM 方法区回收小结
JVM 方法区回收小结方法区也会发生垃圾回收,只是效率和性价比较低。回收主要分为两部分内容:废弃常量和无用的类。废弃常量的回收这与堆中对象的回收类似。以常量池的字符串为例,如果没有任何对象引用了此字符串,那么它就有可能被系统清理出常量池。废弃类的回收此类回收条件较为苛刻,需要满足如下的3点:该类所有实例已被回收,即Java堆中不存在该类的任何实例加载该类的ClassLoader已经被回收该类对
2016-05-02 20:23:48
1100
原创 关于指针的小杂碎
关于指针的小杂碎关于指针的一些小点,这里简单整理下间接取值(指针解引用)的含义根据指针找内容的过程被称为:间接取值 或 指针的解引用NULL与0的关系NULL在外部表现为0。为指针赋值NULL,等价于为指针赋予0。用代码验证下:int *p = NULL; printf("%d",p); // 0printf("%d", NULL == 0) // 1但是,就内部实现而言,NULL值可能并非0
2016-05-02 16:15:08
487
原创 C 运算符优先级与记忆口诀
运算符详情表优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员
2016-05-01 20:16:21
661
原创 C 的布尔值
C 的布尔值基本原理C中并没有像Java中true 和 false 中那种显式的布尔类型,整型担任了此重任。原则就是:0为假,任何非0值为真代码验证#include <stdio.h>#include <stdlib.h>void printLine(char *s){ printf("%s\n",s);}int main(){ if(-1){ printLin
2016-05-01 15:37:11
814
原创 C 逗号运算符
C 逗号运算符语法格式exp1, exp2, exp3, ..., expN;执行效果运算符中每个表达式exp(i)都会被计算,且整个逗号表达式的最终结果为最后一个表达式expN的值。代码举例#include <stdio.h>#include <stdlib.h>int main(){ int a = -1; while(a *= -1,a){ printf("
2016-05-01 10:14:04
939
原创 Java对象死亡标记的过程
Java对象死亡标记的过程在Java可达性标记算法中,要宣告一个对象死亡,至少要进行两次标记过程:原理摘要首先,如果发现对象从GC root出发不可达,那么就会被第一次标记并进行筛选。筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被执行过了,则会被判定为“没有必要执行”。在确定对象有必要执行finalize()方法
2016-04-30 22:26:25
1288
原创 Java 6 和 7 中String.intern返回引用的不同
Java 6 和 7 中String.intern返回引用的不同先看看下面这段代码,这段代码在Java 6 和Java 7中的运行的结果并不同,为什么呢?public class Main { public static void main(String[] args) { String myString = "Rafe"; String str1 = new
2016-04-30 20:11:33
951
翻译 String.intern in Java 6, 7 and 8 – string pooling (在Java 6,7和8中的String.intern - 字符串常量池化)
String.intern in Java 6, 7 and 8 – string pooling (在Java 6,7和8中的String.intern - 字符串常量池化)原文链接:http://java-performance.info/string-intern-in-java-6-7-8关键点java 6中字符串常量池存储于永久代区中,由于此区域大小固定,因此String.intern的
2016-04-30 19:32:50
4601
1
原创 WeakHashMap的使用
WeakHashMap的使用WeakHashMap的使用与HashMap类似,但是区别在于WeakHashMap对Key保留了弱引用(弱引用,四大引用类型中的一种。对于只有弱引用的对象而言,当垃圾回收进行时,无论系统内存是否足够,总会回收该对象所占用的内存),而HashMap保留了对Key的强引用。也就是说只要该HashMap存在,那么Key所引用的对象就不会被回收。而WeakHashMap的Key
2016-04-29 16:40:01
1979
原创 对象的访问定位:句柄与直接指针
对象的访问定位:句柄与直接指针Java程序通过栈中的reference数据来操作堆上的具体对象,而对象的访问方式取决于虚拟机的实现。主流访问方式有句柄和直接指针两种句柄方式Java堆中将会划出一块内存来作为句柄池,reference对象存储的就是对象的句柄地址。句柄中包含了对象实例数据和类型数据的具体地址:直接指针方式reference对象直接存储对象地址:两者对比句柄由于reference中存储的
2016-04-28 16:53:04
4730
原创 对象的内存布局 (HotSpot)小结
对象的内存布局 (HotSpot)小结总共分为三个部分,对象头、实例数据和对齐填充部分对象头主要用于从存储两部分信息:对象自身的运行时数据和类型指针存储对象自身的运行时数据 内容举例: 哈希码HashCodeGC分代年龄锁状态标识线程持有的锁等长度(未开启压缩指针下):32 or 64 位的虚拟机中分别为 32bit or 64 bit官方名称:Mark Word非固定数据结构:
2016-04-28 16:01:20
1042
原创 存储类型和static关键字作用小结
存储类型和static关键字作用C中的存储类型分为两种,一种是静态(static),另一种是自动(automatic)。注意代码是不存在存储类型的问题,它们恒存在于静态内存中。这里所谈的存储类型,都是针对变量而言。静态存储将期望值放在可执行程序文件中对应的部分,然后将此文件装入内存。当程序执行时,这些对应的区域中已经存好期望的值了。 动态存储在代码块运行时创建变量,结束后销毁。存储位置于运行时栈。s
2016-04-28 11:07:38
685
原创 C 存储类型摘要
C 存储类型摘要存储变量的三种可能位置常规内存运行时栈寄存器默认存储类型变量的默认存储类型是由其定义的位置决定的:在任何代码块外定义的变量: 类型:static位置:静态内存产生时间:先于程序执行之前生命周期: 伴随程序的整个执行周期默认值:0代码块中定义的变量: 类型:automatic 位置:栈产生时间:在程序执行到该代码块之前生命周期: 等同该代码块周期此外
2016-04-28 10:10:53
420
原创 C 链接属性浅析
C 链接属性浅析链接属性用于处理多个文件中同名标识符是否指向同一实体的问题。C 中有三种链接属性——None,Internal和External。让我们分别看看这三种类型。None:表示该标识符没有其他链接,总是独立的。也就是说这些标识符都会指向独立的、不同的实体Internal:表示在同一文件中声明的标识符都会指向同一实体,而不同文件中声明的同名标识符则会指向其他实体 换言之,它修饰的变量仅
2016-04-27 16:42:47
758
原创 #define和typedef在定义指针类型上的优劣
#define和typedef在定义指针类型上的优劣先说下结论:typedef更佳。下面看看代码分析:typedef char *ptr_to_char;char c = 'A';ptr_to_char var = &c;printf("%c",*var);//A这句代码利用了typedef定义了一个新的类型ptr_to_char,并将其定义为指向字符的指针。在后面可以直接利用此来创建字符指
2016-04-26 20:38:45
2348
原创 C 命名指针的更好习惯
C 命名指针的更好习惯笔者平常这样创建指针变量:int* a;笔者当时认为这样写可以更加简洁明了,一看就明白a是一个指向int的指针变量,也就是一个int*类型的变量。但在近日阅读《Pointers on C》一书中,书中认为这样写更好:int *a;书中举了一个例子来说明两者之间的差别,读者请看:int* a,b,c;乍一看,容易产生这样的错觉,会误以为abc都是指向int的指针。实则不然,这里三
2016-04-26 20:04:47
1362
原创 Java枚举类型小结
Java枚举类型小结Java5 中引入了一个新的关键字——enum。我们可以利用enum来创建枚举。Java中的枚举也是一种类。它可以有自己的成员变量、方法,也可以实现接口、定义自己的构造器。同其他类一样,每个Java原文件中只能定义一个public访问权限的枚举类,且此public枚举类名需和Java源文件名相同。枚举类和其他类的不同点不能显示继承其他父类 enum定义的枚举类默认继承了jav
2016-04-26 17:07:46
557
原创 C枚举类型小结
C枚举类型小结枚举类型定义了一组常量,其本质为整型。下面就以星期为背景,对C中的枚举做一个小结枚举的定义enum WEEK{MON,TUE,WES,THR,FRI};此代码定义了一个名为WEEK的枚举类型,其中有周一到周五的5种不同的常量。这些常量本质上为整型,可以赋值给其他整型变量或者赋值给一个WEEK类型的变量。枚举变量的定义方法如下:enum WEEK var = MON;这里定义了一个WEE
2016-04-25 19:15:26
965
原创 const 修饰指针的问题
const 修饰指针的问题判断法则沿着*号划一条线:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量验证#include <stdio.h>#include <stdlib.h>int main(){ int a = 1; int b = 2; /*const
2016-04-07 12:38:51
530
翻译 The Java™ Tutorials — Concurrency :Executors
The Java™ Tutorials — Concurrency :Executors原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html关键点Executor 接口定义了executor对象的三种类型线程池是最常见的一种executor实现Fork/Join 是充分利用了多处理器的
2016-02-18 16:57:06
461
翻译 The Java™ Tutorials — Concurrency :Lock Objects 锁对象
The Java™ Tutorials — Concurrency :Lock Objects 锁对象原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html关键点Lock的使用全文翻译Synchronized code relies
2016-02-18 16:32:30
517
翻译 #The Java™ Tutorials — Concurrency :High Level Concurrency Objects 高并发对象
The Java™ Tutorials — Concurrency :High Level Concurrency Objects 高并发对象原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/highlevel.html全文翻译 So far, this lesson has focused on the low
2016-02-18 11:19:46
653
翻译 The Java™ Tutorials — Concurrency :A Strategy for Defining Immutable Objects 一个定义不可变对象的策略
The Java™ Tutorials — Concurrency :A Strategy for Defining Immutable Objects 一个定义不可变对象的策略原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html关键点一个定义不可变对象的策略:
2016-02-18 10:54:02
547
翻译 The Java™ Tutorials — Concurrency :A Synchronized Class Example 一个同步类的例子
The Java™ Tutorials — Concurrency :A Synchronized Class Example 一个同步类的例子原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncrgb.html关键点理解本文案例中,可变对象带来的读取不一致问题。
2016-02-18 09:27:48
515
翻译 The Java™ Tutorials — Concurrency :Immutable Objects 不可变对象
The Java™ Tutorials — Concurrency :Immutable Objects 不可变对象原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html关键点并发环境中,不可变对象十分有用。由于它们的状态不可变,也就因此不会陷入到线程冲突,或
2016-02-18 09:13:52
494
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人