OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2907 { | 2907 { |
2908 v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile(); | 2908 v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile(); |
2909 CHECK(profile == nullptr); | 2909 CHECK(profile == nullptr); |
2910 } | 2910 } |
2911 | 2911 |
2912 int count_1024 = 0; | 2912 int count_1024 = 0; |
2913 { | 2913 { |
2914 heap_profiler->StartSamplingHeapProfiler(1024); | 2914 heap_profiler->StartSamplingHeapProfiler(1024); |
2915 CompileRun(script_source); | 2915 CompileRun(script_source); |
2916 | 2916 |
2917 v8::base::SmartPointer<v8::AllocationProfile> profile( | 2917 std::unique_ptr<v8::AllocationProfile> profile( |
2918 heap_profiler->GetAllocationProfile()); | 2918 heap_profiler->GetAllocationProfile()); |
2919 CHECK(!profile.is_empty()); | 2919 CHECK(profile); |
2920 | 2920 |
2921 const char* names[] = {"", "foo", "bar"}; | 2921 const char* names[] = {"", "foo", "bar"}; |
2922 auto node_bar = FindAllocationProfileNode(*profile, ArrayVector(names)); | 2922 auto node_bar = FindAllocationProfileNode(*profile, ArrayVector(names)); |
2923 CHECK(node_bar); | 2923 CHECK(node_bar); |
2924 | 2924 |
2925 // Count the number of allocations we sampled from bar. | 2925 // Count the number of allocations we sampled from bar. |
2926 for (auto allocation : node_bar->allocations) { | 2926 for (auto allocation : node_bar->allocations) { |
2927 count_1024 += allocation.count; | 2927 count_1024 += allocation.count; |
2928 } | 2928 } |
2929 | 2929 |
2930 heap_profiler->StopSamplingHeapProfiler(); | 2930 heap_profiler->StopSamplingHeapProfiler(); |
2931 } | 2931 } |
2932 | 2932 |
2933 // Samples should get cleared once sampling is stopped. | 2933 // Samples should get cleared once sampling is stopped. |
2934 { | 2934 { |
2935 v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile(); | 2935 v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile(); |
2936 CHECK(profile == nullptr); | 2936 CHECK(profile == nullptr); |
2937 } | 2937 } |
2938 | 2938 |
2939 // Sampling at a higher rate should give us similar numbers of objects. | 2939 // Sampling at a higher rate should give us similar numbers of objects. |
2940 { | 2940 { |
2941 heap_profiler->StartSamplingHeapProfiler(128); | 2941 heap_profiler->StartSamplingHeapProfiler(128); |
2942 CompileRun(script_source); | 2942 CompileRun(script_source); |
2943 | 2943 |
2944 v8::base::SmartPointer<v8::AllocationProfile> profile( | 2944 std::unique_ptr<v8::AllocationProfile> profile( |
2945 heap_profiler->GetAllocationProfile()); | 2945 heap_profiler->GetAllocationProfile()); |
2946 CHECK(!profile.is_empty()); | 2946 CHECK(profile); |
2947 | 2947 |
2948 const char* names[] = {"", "foo", "bar"}; | 2948 const char* names[] = {"", "foo", "bar"}; |
2949 auto node_bar = FindAllocationProfileNode(*profile, ArrayVector(names)); | 2949 auto node_bar = FindAllocationProfileNode(*profile, ArrayVector(names)); |
2950 CHECK(node_bar); | 2950 CHECK(node_bar); |
2951 | 2951 |
2952 // Count the number of allocations we sampled from bar. | 2952 // Count the number of allocations we sampled from bar. |
2953 int count_128 = 0; | 2953 int count_128 = 0; |
2954 for (auto allocation : node_bar->allocations) { | 2954 for (auto allocation : node_bar->allocations) { |
2955 count_128 += allocation.count; | 2955 count_128 += allocation.count; |
2956 } | 2956 } |
(...skipping 11 matching lines...) Expand all Loading... |
2968 | 2968 |
2969 heap_profiler->StopSamplingHeapProfiler(); | 2969 heap_profiler->StopSamplingHeapProfiler(); |
2970 } | 2970 } |
2971 | 2971 |
2972 // A more complicated test cases with deeper call graph and dynamically | 2972 // A more complicated test cases with deeper call graph and dynamically |
2973 // generated function names. | 2973 // generated function names. |
2974 { | 2974 { |
2975 heap_profiler->StartSamplingHeapProfiler(64); | 2975 heap_profiler->StartSamplingHeapProfiler(64); |
2976 CompileRun(record_trace_tree_source); | 2976 CompileRun(record_trace_tree_source); |
2977 | 2977 |
2978 v8::base::SmartPointer<v8::AllocationProfile> profile( | 2978 std::unique_ptr<v8::AllocationProfile> profile( |
2979 heap_profiler->GetAllocationProfile()); | 2979 heap_profiler->GetAllocationProfile()); |
2980 CHECK(!profile.is_empty()); | 2980 CHECK(profile); |
2981 | 2981 |
2982 const char* names1[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"}; | 2982 const char* names1[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"}; |
2983 auto node1 = FindAllocationProfileNode(*profile, ArrayVector(names1)); | 2983 auto node1 = FindAllocationProfileNode(*profile, ArrayVector(names1)); |
2984 CHECK(node1); | 2984 CHECK(node1); |
2985 | 2985 |
2986 const char* names2[] = {"", "generateFunctions"}; | 2986 const char* names2[] = {"", "generateFunctions"}; |
2987 auto node2 = FindAllocationProfileNode(*profile, ArrayVector(names2)); | 2987 auto node2 = FindAllocationProfileNode(*profile, ArrayVector(names2)); |
2988 CHECK(node2); | 2988 CHECK(node2); |
2989 | 2989 |
2990 heap_profiler->StopSamplingHeapProfiler(); | 2990 heap_profiler->StopSamplingHeapProfiler(); |
2991 } | 2991 } |
2992 | 2992 |
2993 // A test case with scripts unloaded before profile gathered | 2993 // A test case with scripts unloaded before profile gathered |
2994 { | 2994 { |
2995 heap_profiler->StartSamplingHeapProfiler(64); | 2995 heap_profiler->StartSamplingHeapProfiler(64); |
2996 CompileRun( | 2996 CompileRun( |
2997 "for (var i = 0; i < 1024; i++) {\n" | 2997 "for (var i = 0; i < 1024; i++) {\n" |
2998 " eval(\"new Array(100)\");\n" | 2998 " eval(\"new Array(100)\");\n" |
2999 "}\n"); | 2999 "}\n"); |
3000 | 3000 |
3001 CcTest::heap()->CollectAllGarbage(); | 3001 CcTest::heap()->CollectAllGarbage(); |
3002 | 3002 |
3003 v8::base::SmartPointer<v8::AllocationProfile> profile( | 3003 std::unique_ptr<v8::AllocationProfile> profile( |
3004 heap_profiler->GetAllocationProfile()); | 3004 heap_profiler->GetAllocationProfile()); |
3005 CHECK(!profile.is_empty()); | 3005 CHECK(profile); |
3006 | 3006 |
3007 CheckNoZeroCountNodes(profile->GetRootNode()); | 3007 CheckNoZeroCountNodes(profile->GetRootNode()); |
3008 | 3008 |
3009 heap_profiler->StopSamplingHeapProfiler(); | 3009 heap_profiler->StopSamplingHeapProfiler(); |
3010 } | 3010 } |
3011 } | 3011 } |
3012 | 3012 |
3013 | 3013 |
3014 TEST(SamplingHeapProfilerApiAllocation) { | 3014 TEST(SamplingHeapProfilerApiAllocation) { |
3015 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 3015 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
3016 LocalContext env; | 3016 LocalContext env; |
3017 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 3017 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
3018 | 3018 |
3019 // Suppress randomness to avoid flakiness in tests. | 3019 // Suppress randomness to avoid flakiness in tests. |
3020 v8::internal::FLAG_sampling_heap_profiler_suppress_randomness = true; | 3020 v8::internal::FLAG_sampling_heap_profiler_suppress_randomness = true; |
3021 | 3021 |
3022 heap_profiler->StartSamplingHeapProfiler(256); | 3022 heap_profiler->StartSamplingHeapProfiler(256); |
3023 | 3023 |
3024 for (int i = 0; i < 8 * 1024; ++i) v8::Object::New(env->GetIsolate()); | 3024 for (int i = 0; i < 8 * 1024; ++i) v8::Object::New(env->GetIsolate()); |
3025 | 3025 |
3026 v8::base::SmartPointer<v8::AllocationProfile> profile( | 3026 std::unique_ptr<v8::AllocationProfile> profile( |
3027 heap_profiler->GetAllocationProfile()); | 3027 heap_profiler->GetAllocationProfile()); |
3028 CHECK(!profile.is_empty()); | 3028 CHECK(profile); |
3029 const char* names[] = {"(V8 API)"}; | 3029 const char* names[] = {"(V8 API)"}; |
3030 auto node = FindAllocationProfileNode(*profile, ArrayVector(names)); | 3030 auto node = FindAllocationProfileNode(*profile, ArrayVector(names)); |
3031 CHECK(node); | 3031 CHECK(node); |
3032 | 3032 |
3033 heap_profiler->StopSamplingHeapProfiler(); | 3033 heap_profiler->StopSamplingHeapProfiler(); |
3034 } | 3034 } |
3035 | 3035 |
3036 TEST(SamplingHeapProfilerLeftTrimming) { | 3036 TEST(SamplingHeapProfilerLeftTrimming) { |
3037 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 3037 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
3038 LocalContext env; | 3038 LocalContext env; |
(...skipping 11 matching lines...) Expand all Loading... |
3050 " a[i] = i;\n" | 3050 " a[i] = i;\n" |
3051 " for (var i = 0; i < 3; ++i)\n" | 3051 " for (var i = 0; i < 3; ++i)\n" |
3052 " a.shift();\n" | 3052 " a.shift();\n" |
3053 "}\n"); | 3053 "}\n"); |
3054 | 3054 |
3055 CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); | 3055 CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); |
3056 // Should not crash. | 3056 // Should not crash. |
3057 | 3057 |
3058 heap_profiler->StopSamplingHeapProfiler(); | 3058 heap_profiler->StopSamplingHeapProfiler(); |
3059 } | 3059 } |
OLD | NEW |