0%

memcached内存管理

由于C语言直接 malloc、free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片段,无法再利用,这种空闲但无法利用内存的现象,称为内存的碎片化

如何解决内存碎片化

memcached 用 slab allocator 机制来管理内存有刺来解决内存碎片化问题

  • 先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。 分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page
  • 然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk的大小是先有一个基本值,根据增长因子来增大
  • slab class:内存区类别(48byte-1M),每个类别有一个slab classId
  • Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去
阅读全文 »

基本命令

启动命令

1
memcached -m 64 -p 11211 -u nobody -vv

如果想要后台启动,则使用-d

1
/memcached -m 64 -p 11211 -u nobody -d
阅读全文 »

堆与虚拟机栈不同,堆的生命周期与JVM实例是一致的,一个JVM实例只存在一个堆内存,在JVM启动的时候就会被创建,其大小也就被确定了,所有的线程共享堆内存(不过还存在线程私有的缓冲区Thread Local Allocation Buffer,简称TLAB),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存

对于对象而言,对象的引用存在于栈帧中,这个引用指向了对象所在的堆中的位置

在方法执行结束后,堆中的对象不会被马上移除,会在垃圾回收时在进行移除

阅读全文 »

本地方法栈

java虚拟机栈用于管理java方法的调用,而本地方法栈则是用来管理本地方法的调用,本地方法栈也是线程私有的,本地方法被执行时,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链表、出口信息。在Hopspot虚拟机中和java虚拟机栈合二为一。

本地方法

使用native进行修饰的方法,底层使用C/C++来进行实现

1
public static native Thread currentThread();

在本地方法栈中登记native方法,在执行引擎执行时加载本地方法

hotspot虚拟机直接将本地方法栈和虚拟机栈合二为一

与虚拟机栈一样,本地方法栈也会抛出StackOverflowError异常和OutOfMemoryError异常

方法调用的指令说明

以一个简单地继承来说明一下

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public interface Breathable {

void breath();
}

public class Parent implements Breathable{
public int field = 0;

public int getField(){
return field;
}

private void testPrivate(){
System.out.println("父类私有方法");
}

public Parent(int field){
this.field = field;
}

public static void testStatic(){

}

public final void testFinal(){

}

public void amountField(){
field+=5;
}

public Parent(){

}

@Override
public void breath() {
System.out.println("人当然会呼吸啦");
}
}

public class Child extends Parent {
public int field = 1;


@Override
public int getField(){
return field;
}

public void test(){

}

@Override
public void amountField(){
field+=5;
}

public static void main(String[] args) {
Parent p = new Child();
// 重写的实例方法 invokevirtual
p.amountField();
// 调用静态方法 invokestatic
p.testStatic();
// 调用父类的final方法 invokevirtual
p.testFinal();

Breathable breathable = new Child();
// 实现的接口方法 invokeinterface
breathable.breath();
//invokevirtual
System.out.println(p.getField());
System.out.println(p.field);

}
}
阅读全文 »