1 package org.apache.commons.jcs.auxiliary.disk.block;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.text.DecimalFormat;
23 import java.util.Random;
24
25 import junit.framework.TestCase;
26
27 import org.apache.commons.jcs.JCS;
28 import org.apache.commons.jcs.access.CacheAccess;
29 import org.apache.commons.jcs.auxiliary.disk.DiskTestObject;
30
31
32
33
34
35
36
37 public class BlockDiskCacheSteadyLoadTest
38 extends TestCase
39 {
40
41 private static final String LOG_DIVIDER = "---------------------------";
42
43
44 private static Runtime rt = Runtime.getRuntime();
45
46
47 private static DecimalFormat format = new DecimalFormat( "#,###" );
48
49
50
51
52
53
54 public void testRunSteadyLoadTest()
55 throws Exception
56 {
57 JCS.setConfigFilename( "/TestBlockDiskCacheSteadyLoad.ccf" );
58
59 logMemoryUsage();
60
61 int numPerRun = 250;
62 long pauseBetweenRuns = 1000;
63 int runCount = 0;
64 int runs = 1000;
65 int upperKB = 50;
66
67 CacheAccess<String, DiskTestObject> jcs = JCS.getInstance( ( numPerRun / 2 ) + "aSecond" );
68
69
70 int numToGet = numPerRun * ( runs / 10 );
71 for ( int i = 0; i < numToGet; i++ )
72 {
73 jcs.get( String.valueOf( i ) );
74 }
75
76
77
78 logMemoryUsage();
79
80 jcs.clear();
81 Thread.sleep( 3000 );
82
83
84
85
86 int totalPut = 0;
87
88 Random random = new Random( 89 );
89 while ( runCount < runs )
90 {
91 runCount++;
92 for ( int i = 0; i < numPerRun; i++ )
93 {
94
95 int kiloBytes = Math.max( upperKB / 2, random.nextInt( upperKB ) );
96 int bytes = ( kiloBytes ) * 1024;
97
98 totalPut++;
99 DiskTestObject object = new DiskTestObject( Integer.valueOf( i ), new byte[bytes] );
100 jcs.put( String.valueOf( totalPut ), object );
101 }
102
103
104 if ( runCount > 1 )
105 {
106 for ( int j = ( ( totalPut - numPerRun ) - ( numPerRun / 2 ) ); j < ( totalPut - numPerRun ); j++ )
107 {
108 jcs.get( String.valueOf( j ) );
109 }
110 }
111
112
113 if ( runCount > 1 )
114 {
115 for ( int j = ( ( totalPut - numPerRun ) - ( numPerRun / 2 ) ); j < ( totalPut - numPerRun ); j++ )
116 {
117 jcs.remove( String.valueOf( j ) );
118 }
119 }
120
121
122 Thread.sleep( pauseBetweenRuns );
123 if ( runCount % 100 == 0 )
124 {
125
126
127
128
129 logMemoryUsage();
130 }
131 }
132
133 Thread.sleep( 3000 );
134
135 logMemoryUsage();
136
137 Thread.sleep( 10000 );
138
139 logMemoryUsage();
140
141 System.gc();
142 Thread.sleep( 3000 );
143 System.gc();
144
145 logMemoryUsage();
146 }
147
148
149
150
151 private static void logMemoryUsage()
152 {
153 long byte2MB = 1024 * 1024;
154 long total = rt.totalMemory() / byte2MB;
155 long free = rt.freeMemory() / byte2MB;
156 long used = total - free;
157 System.out.println( LOG_DIVIDER );
158 System.out.println( "Memory:" + " Used:" + format.format( used ) + "MB" + " Free:" + format.format( free )
159 + "MB" + " Total:" + format.format( total ) + "MB" );
160 }
161 }